私は関係テーブルを持っています:
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
動物を他の動物と結びつける。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)
そして、これを使用してレールで適切な has_many 関係を作成する方法が見つかりません。どうやら、has_many の結合条件を提供する方法はありません。
私は現在 finder_sql を使用しています:
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}'
しかし、この方法にはアクティブレコードの魔法が壊れるという大きな欠点があります。例えば :
@animal.friends.first
finder_sql を無制限に実行し、数千行をフェッチしてから、配列の最初のものを取得します (そして、貴重な数秒/ req を失います)。
ARに欠けている機能だと思いますが、最初に確認したいです:)ありがとう