У меня есть отношения таблица:Невозможно определить: объединяет условия в 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
Извините за задержку loooooooong, прежде чем ответить на это, я, наконец, успел проверить ваше решение, и он работает как шарм, из коробки. – Gravis