在 Rails 4 中使用 has_many :through :uniq 时的弃用警告
Posted
技术标签:
【中文标题】在 Rails 4 中使用 has_many :through :uniq 时的弃用警告【英文标题】:Deprecation warning when using has_many :through :uniq in Rails 4 【发布时间】:2013-05-10 07:36:17 【问题描述】:Rails 4 在使用 :uniq => true 和 has_many :through 时引入了弃用警告。例如:
has_many :donors, :through => :donations, :uniq => true
产生以下警告:
DEPRECATION WARNING: The following options in your Goal.has_many :donors declaration are deprecated: :uniq. Please use a scope block instead. For example, the following:
has_many :spam_comments, conditions: spam: true , class_name: 'Comment'
should be rewritten as the following:
has_many :spam_comments, -> where spam: true , class_name: 'Comment'
重写上述 has_many 声明的正确方法是什么?
【问题讨论】:
【参考方案1】:uniq
选项需要移动到范围块中。注意范围块需要是has_many
的第二个参数(即不能将它留在行尾,它需要移到:through => :donations
部分之前):
has_many :donors, -> uniq , :through => :donations
这可能看起来很奇怪,但如果考虑到有多个参数的情况,它会更有意义。例如,这个:
has_many :donors, :through => :donations, :uniq => true, :order => "name", :conditions => "age < 30"
变成:
has_many :donors, -> where("age < 30").order("name").uniq , :through => :donations
【讨论】:
谢谢,这很好用!你在哪里找到这个的?我无法在任何地方的文档中找到它。 我实际上在升级到 Rails 4 一书中看到了它(正在进行中):upgradingtorails4.com -- 在其他任何地方都找不到它。 @DylanMarkow 升级到 Rails 4 的链接已失效。这本书现在已经在github.com/alindeman/upgradingtorails4github.com/alindeman/upgradingtorails4 下以 CC 许可证发布 在 Rails 5 中使用distinct
而不是 uniq
。有关详细信息,请参阅this answer。【参考方案2】:
除了 Dylan 的回答之外,如果您碰巧要扩展与模块的关联,请确保将其链接在范围块中(而不是单独指定),如下所示:
has_many :donors,
-> extending(DonorExtensions).order(:name).uniq ,
through: :donations
也许只有我一个人,但使用范围块来扩展关联代理似乎很不直观。
【讨论】:
以上是关于在 Rails 4 中使用 has_many :through :uniq 时的弃用警告的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 has_many 的 PaperTrail 版本控制:通过在 Rails 4 中实现关联
Rails 4,通过连接表在has_many中指定自定义外键?