У меня есть модель Place и модель Event. Места могут иметь события, которые имеют место в определенную дату.
Как настроить мои ассоциации и поисковые устройства для загрузки всех мест, включая (загружать) свои события в определенную дату без проблемы с запросом N + 1?
Что я пробовал:
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).
Я успешно создал ассоциацию, которая делает то, что я хочу, но не динамически (не принимает параметры)
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.
Проблема для меня в том, что я не могу найти способ загружать/загружать динамические условия. Поскольку preload и include ожидают имя ассоциации как параметр и не могут быть уточнены с параметрами. По крайней мере, я не нашел возможности сделать это.