J'ai une table de relation:Impossible de définir: joint les conditions dans la relation 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
reliant les animaux à d'autres. La meilleure façon de retreive associations SQL est:
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)
Et je ne peux pas trouver un moyen de créer une bonne relation has_many dans des rails avec cela. Apparemment, il n'y a aucun moyen de fournir des conditions de jointure pour has_many.
J'utilise actuellement un 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}'
mais cette méthode a le grand inconvénient de briser la magie activerecord. Par exemple:
@animal.friends.first
exécutera la finder_sql sans limite, aller chercher des milliers de lignes, puis en prenant la première du tableau (et perdre plusieurs secondes précieuses /REQ).
Je pense qu'il est une fonctionnalité manquante de AR, mais je voudrais être sûr d'abord :) Merci
Merci, j'aime l'idée! Je vais tester dès que je peux et vous le faire savoir. – Gravis
Désolé pour le délai loooooooong avant de répondre à cela, j'ai finalement eu le temps de tester votre solution, et cela fonctionne comme un charme, hors de la boîte. – Gravis