左外连接使用轨道中连接表的模型

时间:2011-02-10 19:54:17

标签: ruby-on-rails ruby-on-rails-3 activerecord

我需要在rails中进行左外连接,但我需要模型对象用于连接表。

我想要的是一个日期列表,以及每天的指标。无论是否有指标,我都需要有所有的日子,但我不想在数据库中进行一堆往返。

这有效,但会导致问题,因为当我真正想要Metric对象时,它认为我有PeriodDay对象:

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

我可以在Metric对象上使用find_by_sql,但是查询构建比这个简化示例更复杂(和有条件),所以我宁愿找出这个问题的“轨道方式”。

2 个答案:

答案 0 :(得分:0)

我目前的解决方法是遍历记录并从PeriodDay对象的属性创建Metric对象。它感觉效率不高,但它比进行多个数据库调用更好。

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

答案 1 :(得分:0)

假设Period有许多PeriodDay有很多Metric,而period_id是PeriodDay模型的属性,你的解决方法应该是这样的:

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

这不会为您提供原始问题中提到的各自Metric对象的日期列表,但它会为您提供特定时间段内所有Metric对象的列表。 (除非我遗漏了什么......)

如果您想要包含其包含的度量标准对象的PeriodDay对象列表,则可以使用includes而不是joins

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

这将执行两个查询(一个用于获取周期天数,另一个用于获取指标),但它更具可读性。