1

結合テーブルとの多対多の関係にあるasbsの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
4

0 に答える 0