2016-12-21 3 views
0

Рассмотрим эти две модели, связанные 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.

+0

ли вы пробовали 'Program.joins (: spent_finances) .includes (: spent_finances) .merge (SpentFinance.where (time_period_type: time_period_type)) '? – Thanh

ответ

0

Вдохновленный вашей Первая попытка как вы хотите нетерпеливого нагрузки присоединиться, дать попробовать на следующее:

Program.includes(:spent_finances).where(spent_finances: {time_period_type: time_period_type}).references(:spent_finances) 
Смежные вопросы