Ich habe eine Beziehung Tabelle:Kann nicht definieren: verbindet Bedingungen in has_many Beziehung?
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
Tiere zu anderen verbinden. Der beste Weg, Verbände in SQL retreive ist:
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)
Und ich kann nicht einen Weg finden, eine richtige Beziehung has_many in Schienen mit dieser zu schaffen. Anscheinend gibt es keine Möglichkeit, Beitrittsbedingungen für has_many bereitzustellen.
Ich verwende derzeit eine 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}'
aber diese Methode hat den großen Nachteil, Active Magie zu brechen. Zum Beispiel:
@animal.friends.first
die finder_sql ohne Begrenzung, führen Tausende von Zeilen abgerufen, dann die erste Aufnahme des Arrays (und einige Sekunden lang wertvollen /req zu verlieren).
Ich denke, es ist ein fehlendes Feature von AR, aber ich möchte, dass der erste sein :) Dank
Danke, ich mag die Idee! Ich werde so schnell wie möglich testen und Sie wissen lassen. – Gravis
Entschuldigung für die lange Verzögerung, bevor ich darauf antwortete, hatte ich endlich Zeit, Ihre Lösung zu testen, und es funktioniert wie ein Zauber, out of the box. – Gravis