Ho un modello Luogo e un modello Event. Luoghi possono eventi che hanno luogo in una data specifica.Il precarico ha_molte associazioni con condizioni dinamiche
Come posso impostare le mie associazioni e i miei finder per caricare tutti i posti incluso (caricamento ansioso) i loro eventi in una data specifica senza N + 1 problema di query?
Quello che ho provato:
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).
sono venuto con successo con un'associazione che fa quello che voglio, ma non è dinamica (non accetta parametri)
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.
Il problema per me è che non riesco a trovare un modo di precaricare/caricare carico con condizioni dinamiche. Perché precarico e include si aspettano il nome dell'associazione come parametro e non possono essere rifiniti con parametri. Almeno non ho trovato modo di farlo.
Questo è un bel articolo che spiega eager loading in Rails: http://blog.arkency.com/2013/12/rails4-preloading/ – MurifoX
Grazie, ma già letto questo articolo un paio di volte, ma non è stato possibile trovare informazioni sulle condizioni dinamiche durante il precaricamento. – nvano
Impossibile trovare un modo per passare argomenti a ActiveRecord :: Associations :: Preloader, anche. Sovrascrittura o sottoclasse sembra essere un approccio sbagliato. – nvano