我有一個關係表:無法定義:在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
連接動物給他人。中檢索協會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}'
但這種方法有破魔的ActiveRecord的巨大劣勢。例如:
@animal.friends.first
將執行finder_sql無極限,獲取數千行,然後以第一陣列的(和失去幾珍貴秒/REQ)。
我想這是從AR缺失的功能,但我想,以確保第一:) 感謝
謝謝,我喜歡這個主意!我會盡快測試並通知您。 – Gravis 2009-05-27 09:51:43