私は関係テーブルを持っている:定義できません:has_many関係の条件を結合しますか?
create_table "animal_friends", :force => true do |t|
t.integer "animal_id"
t.integer "animal_friend_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "status_id", :default => 1
end
は、他の人に動物を結びます。
SELECT animals.*
from animals join animal_friends as af
on animals.id =
case when af.animal_id = #{id} then af.animal_friend_id else af.animal_id end
WHERE #{id} in (af.animal_id, af.animal_friend_id)
そして、私はこれで、レールで適切にhas_manyの関係を作成する方法を見つけることができません:SQLに関連付けを盗んするための最良の方法です。どうやら、has_manyの結合条件を提供する方法はありません。
has_many :friends, :class_name => "Animal", :finder_sql => 'SELECT animals.* from animals join animal_friends as af on animals.id = case when af.animal_id = #{id} then af.animal_friend_id else af.animal_id end ' +
'WHERE #{id} in (af.animal_id, af.animal_friend_id) and status_id = #{Status::CONFIRMED.id}'
をしかし、この方法では、ActiveRecordの魔法を破るの大きな欠点があります。
私は現在finder_sqlを使用しています。例えば:
@animal.friends.first
は、配列の最初の(およびいくつかの貴重秒を/REQを失う)を取って、数千行をフェッチ、制限なしfinder_sqlを実行します。
私はそれがARから欠落している機能だと思うが、私は必ず最初にしたいと思います:)アクティブレコードで多くの関係に多くを作成するための おかげ
ありがとう、私はアイデアが好き!できるだけ早くテストしてお知らせします。 – Gravis
これに返信する前にloooooooongの遅れにご迷惑をおかけして申し訳ありませんが、私は最終的にあなたのソリューションをテストする時間がありました。 – Gravis