Ich habe ein Place-Modell und ein Event-Modell. Orte können Ereignisse haben, die stattfinden an einem bestimmten Datum.Preload has_many Assoziationen mit dynamischen Bedingungen
Wie kann ich meine Verknüpfungen und Finder einrichten, um alle Orte einschließlich (eifrig laden) ihrer Ereignisse zu einem bestimmten Datum ohne N + 1 Abfrageproblem zu laden?
Was ich versucht habe:
class Place
has_many :events
end
Place.all.preload(:events).where("events.start_date > '#{time_in_the_future}'")
#ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "events".
Place.all.includes(:events).where("events.start_date > '#{time_in_the_future}'").references(:event)
# only loads places that have an event at the specific date and not all places including their events (if there are any events).
ich erfolgreich mit einem Verband kam das tut, was ich will, aber ist nicht dynamisch (akzeptiert keine Parameter)
class Place
has_many :events, -> {where("events.start_date > '#{Time.now}'")}
end
Place.all.preload(:events)
# perfect: executes two queries: One to get all 'places' and one to get all 'events' that belong to the places and merges the 'events' into the 'place' objects.
# But I can't pass time as a parameter, so time is always Time.now (as specified in the has_many association).
# Place.all.preload(:events).where(xyz) gives wrong results like the examples above.
Das Problem für mich ist, dass ich keinen Weg finden kann, um mit dynamischen Bedingungen vorzuladen/eifrig zu laden. Weil preload und includes den Assoziationsnamen als Parameter erwarten und nicht mit Parametern verfeinert werden können. Zumindest habe ich keine Möglichkeit gefunden, dies zu tun.
Dies ist ein schöner Artikel erklärt eager loading in Rails: http://blog.arkency.com/2013/12/rails4-preloading/ – MurifoX
Danke, aber schon diesen Artikel lesen ein paar von Zeiten aber konnte keine Informationen über dynamische Bedingungen beim Vorladen finden. – nvano
Es kann auch keine Möglichkeit gefunden werden, Argumente an ActiveRecord :: Associations :: Preloader zu übergeben. Überschreiben oder Unterklassen scheint ein falscher Ansatz zu sein. – nvano