Frage

Ich habe eine Reihe von benutzerdefinierten find_by_sql Abfragen in Rails. Ich möchte mit ihnen eifrig Laden verwenden, aber es scheint nicht ein guter Weg, dies zu tun.

Ich habe die eager_custom.rb Datei im Umlauf gesehen und es scheint nicht mit Rails Arbeit jetzt. Es erscheint Rails eifrig Laden funktioniert jetzt anders, 2 Abfragen mit (die regelmäßigen Abfrage sowie eine Abfrage aus, die ‚id IN‘ die Ide von der ersten Abfrage), anstelle des einzelnen Abfrage in der Vergangenheit verwendet join.

Meine Frage ist, wenn ich eine benutzerdefinierte SQL-Abfrage zu tun, dann tun ‚id IN‘ query, ist es eine Möglichkeit, in die ursprünglichen Abfrageergebnisse zugeordnet Objekte hinzufügen zurück?

Zum Beispiel habe ich Themen mit find_by_sql geladen, dann finde ich Thema Bilder, in denen die Themen-ID in den Themen-IDs ist, ist es eine Möglichkeit, die Bilder manuell zurück zu den Themen hinzufügen?

Danke

War es hilfreich?

Lösung

Wie Sie bemerkt haben, in Rails 2.1 eine neue Art von eifrigen / Vorbelastung wurde eingeführt, die mehrere Abfragen mit id IN (...) verwendet. Diese Methode ist in der Regel schneller, vor allem, wenn es mehrere Verbände vorbelastet wird. Sie können diese Funktionalität mithilfe der find_by_sql Klassenmethode manuell mit preload_associations von Active geerbt verwenden (nicht empfohlen). Zum Beispiel:

class Person
  def self.find_a_special_group
    people = find_by_sql("...")
    preload_associations(people, [:jobs, :addresses])
    return people
  end
end

Die preload_associations Methode ist geschützt, so dass Sie es von innerhalb der Klasse aufrufen muss, und es dauert (1) ein Array von Objekten, (2) ein Array, Hash oder ein Symbol der Verbände (gleiche Format wie find der :include Option) und (3) eine Hash-Optionen. Lesen Sie die Dokumentation für die Active :: AssociationPreload :: Class um weitere Informationen zu Modul.

Allerdings, gesagt haben, all das, diese Technik sicherlich nicht wünschenswert ist , wie die Rails Dokumentation entmutigt Programmierer von preload_associations direkt verwenden. Sind Sie sicher, dass Sie find_by_sql verwenden? Sind Sie sicher, dass Sie alle Optionen kennen find nimmt? (:select, :from, :joins, :group, :having, usw.) Ich sage nicht, Sie find_by_sql nicht brauchen, aber es könnte sich lohnen ein paar Minuten sicher zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top