結合テーブルとの多対多の関係にあるasとbsの2 つのテーブルがあるとします。結合テーブルには属性condがあります。
記録は次のとおりです。
なので:
id
1
腹筋:
id a_id b_id cond
1 1 1 1
2 1 1 0
BS:
id
1
今私がやります:
b = A.find(1).bs.where(:abs => {:cond => 1}).includes(:abs).first
これでbインスタンスが得られます。問題は、b.absがすべての abs行を返すのはなぜですか?
includesメソッドは、アソシエーション メソッドへの後続の呼び出しでアソシエーションをリロードしないようにするためのものだと思いました。最初の呼び出しで whereを使用したので、b.absがcond == 1の行のみを返すことを期待します。
Rails コンソールでこれを試しましたが、 b.abs呼び出しを実行しても SQL 要求は発行されません。ここで何が起きてるの?私がやりたいことをする方法はありますか、または*b.abs.where(:abs => {:cond => 1}) のようにb.absに条件を再度設定する必要がありますか?
コメントで要求されているように、モデルのコードは次のとおりです。
猫アプリ/モデル/a.rb
class A < ActiveRecord::Base
has_many :bs, :through => :abs
has_many :abs
end
猫アプリ/モデル/b.rb
class B < ActiveRecord::Base
has_many :as, :through => :abs
has_many :abs
end
猫アプリ/モデル/ab.rb
class Ab < ActiveRecord::Base
attr_accessible :cond, :a_id, :b_id
belongs_to :a
belongs_to :b
end