Рассмотрим эти две модели, связанные Program
и SpentFinance
:Rails включает в себя ассоциации с левой присоединиться к условиям
class Program < ApplicationRecord
has_many :spent_finances
end
class SpentFinance < ApplicationRecord
end
Каждый потраченный финансирование имеет time_period_type
, такие как 'year'
или 'month'
.
Как я могу получить все программы и в то же время предварительно загрузить все связанные spent_finances
, связанные с программой, имеющей определенный time_period_type
?
Примечание:
- Запрос должен извлечь все программы, включая программы, которые не имеют каких-либо затраченные финансы запрашиваемого времени типа периода.
- должен обеспечить возможность программно изменять
time_period_type
в запросе
Эти попытки, которые я сделал на растрескивание этой проблемы.
Первая попытка
Program
.references(:spent_finances)
.includes(:spent_finances)
.merge(SpentFinance.where(time_period_type: time_period_type))
Это не работает, потому что она отфильтровывает программы, которые не потратили финансы с указанного времени типа периода. (Это добавляет условие time_period_type в предложении WHERE и не Соединить ON пункт.)
Вторая попытка
class Program < ApplicationRecord
has_many :yearly_spent_finances,
-> { where(time_period_type: 'year') },
className: 'SpentFinance'
end
programs = Program.references(:yearly_spent_finances).includes(:yearly_spent_finances)
programs[0].yearly_spent_finances
Это работает (последняя строка не выполняет другой запрос), и это действительно так officially recommended solution. Однако это не позволяет мне программно указать желаемый time_period_type
. Например, если я хочу выполнить аналогичный запрос, как указано выше, но измените значение time_period_type на 'month'
, тогда мне придется добавить еще одну ассоциацию has_many :monthly_spent_finances
.
ли вы пробовали 'Program.joins (: spent_finances) .includes (: spent_finances) .merge (SpentFinance.where (time_period_type: time_period_type)) '? – Thanh