Rails 4でhas_many:through:uniqを使用する際の非推奨警告


95

Rails 4では、has_many:throughで:uniq => trueを使用すると非推奨の警告が導入されました。例えば:

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宣言を書き換える正しい方法は何ですか?

回答:


237

uniqオプションは、スコープのブロックに移動する必要があります。スコープブロックは2番目のパラメーターである必要があることに注意してください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

よろしくお願いします。どこで見つけたの?私はそれをどこのドキュメントでも見つけることができませんでした。
Ryan Crispin Heneise 2013年

6
:私は実際にレール4本(それは進行中です)へのアップグレードでそれを見たupgradingtorails4.com -どこにもそれを見つけることができませんでした。
ディランマルコウ2013年

1
@DylanMarkow Rails 4へのアップグレードのリンクは無効です。本は現在github.com/alindeman/upgradingtorails4の
Ivar

1
Rails 5 distinctではの代わりに使用しますuniq。詳細については、この回答を参照してください。
Nic Nilov 2017

5

Dylansの回答に加えて、モジュールとの関連付けをたまたま拡張している場合は、次のように、それをスコープブロックでチェーンすることを確認してください(個別に指定するのではなく)。

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

多分それは私だけかもしれませんが、スコープブロックを使用してアソシエーションプロキシを拡張することは非常に直感的ではないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.