我需要在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,但是查询构建比这个简化示例更复杂(和有条件),所以我宁愿找出这个问题的“轨道方式”。
答案 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)
这将执行两个查询(一个用于获取周期天数,另一个用于获取指标),但它更具可读性。