Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用rails中联接表的模型进行左外部联接_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 使用rails中联接表的模型进行左外部联接

Ruby on rails 使用rails中联接表的模型进行左外部联接,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我需要在rails中进行左外部联接,但我需要为联接表创建模型对象 我想要的是一个天数列表,以及每天的指标。我需要所有的时间,不管是否有指标,但我不想来回访问数据库 这是可行的,但会导致问题,因为它认为我有PeriodDay对象,而我真正想要的是公制对象: PeriodDay.select("metrics.*").join('LEFT OUTER JOIN metrics ON period_days.date = metrics.date').where('period_id = ?', cu

我需要在rails中进行左外部联接,但我需要为联接表创建模型对象

我想要的是一个天数列表,以及每天的指标。我需要所有的时间,不管是否有指标,但我不想来回访问数据库

这是可行的,但会导致问题,因为它认为我有PeriodDay对象,而我真正想要的是公制对象:

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

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

我当前的解决方法是循环记录,并从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
metrics=[]
recs=PeriodDay.select(“metrics.*”).join('period_days.date=metrics.date上的左外部联接度量')。其中('period_id=?',当前_period)
对于rec中的rec

度量假设Period有许多PeriodDay有许多度量,并且Period_id是PeriodDay模型的一个属性,那么您的解决方法应该与以下内容相同:

Metric.includes(:period_day).where(:period_day => {:period_id => @current_period})
这不会像您在原始问题中提到的那样,为您提供一个包含相应度量对象的天数列表,但会为您提供一个特定时期内所有度量对象的列表。(除非我遗漏了什么…)

如果需要包含度量对象的PeriodDay对象列表,可以使用
包含
而不是
连接

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

这将执行两个查询(一个用于获取时段天数,另一个用于获取度量),但可读性要高得多。

根据定义,像这样的左外部联接可能会导致度量对象不存在,因此使用空ID的度量对象没有意义。您需要获取PeriodDay对象作为结果。@Pan Thomakos是的,可能有空ID,但我不需要引用ID(无更新等)。如果我有PeriodDay对象,那么所有度量字段都被视为字符串,这是一个巨大的PITA。问题是,因为您正在进行左外联接,其中主表是period_days,所以有可能会有很多完全空的度量对象,其中只有period_day信息。如果你在做一个“度量左外连接周期\天”,那么这将是另一回事。我理解左外连接的意义。请参见下面我当前的解决方法。这会产生期望的结果,但必须有更好的方法。第一种解决方案不起作用,因为在度量对象不存在的期间,我需要几天的空白度量对象。第二个解决方案不起作用,因为我需要度量对象,而这将返回PeriodDay对象。