Rails 4中使用has_many:through:uniq时的弃用警告

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

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的回答,如果你碰巧正在扩展与模块的关联,请确保将其链接到作用域块(而不是单独指定),如下所示:

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

也许它只是我,但使用范围块来扩展关联代理似乎是非常不直观的。