2009-12-17 16 views
6

Ich habe eine Reihe von benutzerdefinierten find_by_sql Abfragen in Rails. Ich würde gerne eifrig mit ihnen laden, aber es scheint keinen guten Weg zu geben, dies zu tun.Rails hinzufügen benutzerdefinierte Eager laden

Ich habe gesehen, die eager_custom.rb-Datei herumschweben und es scheint nicht mit Rails jetzt zu arbeiten. Es scheint, dass Rails das E-Mail-Laden jetzt anders durchführt, indem es zwei Abfragen (die reguläre Abfrage plus eine Abfrage, bei der die 'ID IN' die IDs der ersten Abfrage verwendet) statt der einzigen in der Vergangenheit verwendeten Join-Abfrage verwendet.

Meine Frage ist, wenn ich eine benutzerdefinierte SQL-Abfrage, dann 'id IN' Abfrage, gibt es eine Möglichkeit, zurück assoziierte Objekte in die ursprünglichen Abfrageergebnisse hinzufügen?

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

Dank

Antwort

10

Wie Sie bemerkt haben, in Rails 2.1 eine neue Art von eifrigen/Vorbelastung eingeführt wurde, die mit id IN (...) mehrere Abfragen verwendet. Diese Methode ist normalerweise schneller, insbesondere wenn mehrere Verknüpfungen vorgeladen sind. Sie können diese Funktionalität manuell mit find_by_sql verwenden, indem Sie die von ActiveRecord geerbte Klassenmethode preload_associations 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 Verfahren geschützt ist, so müssen Sie es aus der Klasse aufrufen, und es dauert (1) mit einer Anordnung von Objekten, (2) ein Array, Hash oder ein Symbol von Assoziationen (dasselbe Format wie find 's :include Option) und (3) ein Optionen Hash. Weitere Informationen finden Sie in der Dokumentation zum ActiveRecord :: AssociationPreload :: ClassMethods-Modul.

Allerdings, Diese Technik ist sicherlich unerwünscht als die Rails-Dokumentation entmutigt Programmierer von preload_associations direkt verwenden. Sind Sie sicher, dass Sie find_by_sql verwenden müssen? Sind Sie sicher, dass Sie alle Optionen kennen, die find dauert? (:select, :from, :joins, :group, :having, etc) Ich sage nicht, dass Sie find_by_sql nicht brauchen, aber es könnte ein paar Minuten wert sein, um sicherzustellen.

+0

Das ist perfekt, vielen Dank. Ich würde lieber find_by_sql nicht verwenden, aber ich habe eine Reihe von sehr komplexen Abfragen. – riley

+0

Danke, Alex! – MikeMarsian

Verwandte Themen