使用时,Rails 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声明的正确方法是什么?
答案 0 :(得分:235)
需要将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
答案 1 :(得分:5)
除了Dylans的回答,如果您正在扩展与模块的关联,请确保将其链接到范围块(而不是单独指定),如下所示:
has_many :donors,
-> { extending(DonorExtensions).order(:name).uniq },
through: :donations
也许只是我,但使用范围块来扩展关联代理似乎非常不直观。