Ich portiere eine Rails App auf Rails 4.2. Diese Rails-App enthält teilweise recht komplexen manuellen SQL-Code in Assoziationen - teils aufgrund von DB-Optimierungen (zB Subselects statt JOINs), teils aufgrund einer zum Zeitpunkt des Schreibens noch nicht praktikablen Alternative (Rails 3.0), teilweise sicher aufgrund von Unkenntnis (Ich hoffe, zumindest - das wäre leicht zu lösen).Portierung kompliziert has_many Beziehungen zu Rails> 4.1 (ohne finder_sql)
Beispiel: Eine InternalMessage-Klasse. Nachrichten können zwischen Benutzern gesendet werden (Empfänger einer InternalMessage und "Löschungen" von Nachrichten werden in InternalMessagesRecipients gespeichert, da es mehrere geben kann) und sie können gelesen, beantwortet, weitergeleitet und gelöscht werden. Der Verein sieht wie folgt aus:
class User < AR::Base
has_many :internal_messages,
:finder_sql => "SELECT DISTINCT(internal_messages.id), internal_messages.* FROM internal_messages " +
' LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id' +
' WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}',
:counter_sql => 'SELECT count(DISTINCT(internal_messages.id)) FROM internal_messages ' +
' LEFT JOIN internal_messages_recipients ON internal_messages.id=internal_messages_recipients.internal_message_id' +
' WHERE internal_messages.sender_id = #{id} OR internal_messages_recipients.recipient_id = #{id}'
# ...
end
Der wichtigste Teil der „OR“ Klausel am Ende ist - mit dieser Vereinigung Ich möchte beide bekommen empfangenen und gesendeten Nachrichten, die mit der Benutzertabelle separat verbunden sind:
da eine InternalMessage mehrere Empfänger haben kann (und auch an den Absender selbst gesendet werden kann).
F: Wie portiere ich diese finder_sql
an eine Rails 4.2 kompatible has_many
Definition?
Natürlich ist dies schlechter, wenn Sie Memoization von Ergebnissen wollen, besonders, damit sie mit 'reload' arbeiten. Gibt es eine Möglichkeit, Schienen zu erhalten, um diese Beziehungen ohne den Fremdschlüssel zu pflegen? – duane