在轨道4的uniq:通过:使用的has_many时弃用警告(Deprecation warning

2019-09-03 10:30发布

导轨4已经使用时引入一个弃用警告:uniq的=>使用的has_many真:通过。 例如:

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声明的正确方法?

Answer 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


Answer 2:

除了Dylans回答,如果你碰巧与扩展模块的联系,确保您IT连锁的范围块(而不是分别指定它),就像这样:

has_many :donors,
  -> { extending(DonorExtensions).order(:name).uniq },
  through: :donations

也许它只是我,但它似乎很直观使用范围区块延长关联代理。



文章来源: Deprecation warning when using has_many :through :uniq in Rails 4