导轨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声明的正确方法?
的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
除了Dylans回答,如果你碰巧与扩展模块的联系,确保您IT连锁的范围块(而不是分别指定它),就像这样:
has_many :donors,
-> { extending(DonorExtensions).order(:name).uniq },
through: :donations
也许它只是我,但它似乎很直观使用范围区块延长关联代理。