1. ホーム
  2. ruby-on-rails

[解決済み] Rails 4でhas_many :through :uniqを使用すると非推奨の警告が出る。

2023-01-26 03:27:39

質問

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

どのように解決するのですか?

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