在 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中指定自定义外键?

如何将参数传递给 Rails 4 中的 has_many 关联范围?

通过 has_many 的 Rails 4 应用程序

Has_many:通过 Rails 4 实例变量不起作用

Ruby-on-Rails:多个 has_many :通过可能吗?