7

次のようなモデルのセットアップがあります。

class User
  has_many :items
  has_many :words, :through => :items
end

class Item
  belongs_to :user
  belongs_to :word

  default_scope where(:active => true)
end

class Words
  has_many :items
end

私が抱えている問題は、default_scope が次の関連付けに適用されていないことです。

 user.words

この SQL の代わりに:

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) AND ((`items.active = 1))

ログに次の SQL が記録されます。

SELECT `words`.* FROM `words` INNER JOIN `items` ON `words`.id = `items`.word_id WHERE ((`items`.user_id = 1)) 

これは、デフォルトのスコープが通常のモデルとその子の関連付けでは機能するが、結合テーブルでは機能しないためだと思います。

指定する必要なく、関連付け間で結合テーブルスコープを機能させる正しいRailsの方法は何ですか? 存在しますか?

4

2 に答える 2

11

#ruby-on-rails の dfr の助けを借りて答えを見つけました。

User クラスで、has_many リレーションを次のように設定します。

 has_many :words, :through => :items, :conditions => { "items.active" => true }

これは、User と Word の間に habtm 結合の関連付けがありますが、user.words が呼び出されたときに Item モデルが実際に読み込まれないためです。したがって、 User モデル内の関連付けにスコープを適用する必要があります。

それが誰かを助けたことを願っています。

于 2011-03-28T18:50:38.237 に答える
2

ありがとうございます。このチケット (無効ですが) についても議論しています: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3610-has_many-through-associations-may-not-respect-default_scope -条件#チケット-3610-17

個人的には、このチケットは無効ではないように感じます。デフォルト スコープはデフォルト スコープです。

于 2011-03-29T14:32:37.123 に答える