Левое внешнее соединение с использованием модели соединенного стола в рельсах - PullRequest
0 голосов
/ 10 февраля 2011

Мне нужно выполнить левое внешнее объединение в рельсах, но мне нужно, чтобы объекты модели были для объединенной таблицы.

Мне нужен список дней с метриками для каждого дня.Мне нужно иметь все дни независимо от того, были ли метрики, но я не хочу совершать кучу циклических обращений к базе данных.

Это работает, но вызывает проблемы, потому что думает, что у меня есть PeriodDayобъекты, когда мне действительно нужны объекты Metric:

PeriodDay.select("metrics.*").join('LEFT OUTER JOIN metrics ON period_days.date = metrics.date').where('period_id = ?', current_period)

Я могу использовать find_by_sql для объекта Metric, но построение запросов является более сложным (и условным), чем этот упрощенный пример, поэтому я бы лучше выяснил "рельсы путь "для этой проблемы.

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Предполагая, что Period имеет много PeriodDay, имеет много Metric, а period_id является атрибутом вашей модели PeriodDay, ваш обходной путь должен быть примерно таким:

Metric.includes(:period_day).where(:period_day => {:period_id => @current_period})

Это не даст вам список дней с соответствующими им объектами Метрики, как вы упомянули в исходном вопросе, но он получит список всех объектов Метрики за определенный период. (если я что-то упустил ...)

Если вы хотите получить список объектов PeriodDay с включенными в них объектами Metric, вы можете использовать includes вместо joins.

PeriodDay.includes(:metrics).where(:period_id => @current_period)

Это выполнит два запроса (один для получения дней периода, а другой для получения метрик), но он намного более читабелен.

0 голосов
/ 11 февраля 2011

Мой текущий обходной путь - это циклический просмотр записей и создание объектов Metric из атрибутов объекта PeriodDay. Это не кажется эффективным, но это лучше, чем делать несколько вызовов базы данных.

metrics = []
recs = PeriodDay.select("metrics.*").join('LEFT OUTER JOIN metrics ON period_days.date = metrics.date').where('period_id = ?', current_period)
for rec in recs
  metrics << Metric.new(rec.attributes)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...