0

我有一个模型圈:

class Lap < ActiveRecord::Base
  belongs_to :car

  def self.by_carmodel(carmodel)
    scoped = joins(:car_model).where(:car_models => {:name => carmodel})
    scoped
  end

  def self.fastest_per_car
    scoped = select("laps.id",:car_id, :time, :mph).group("laps.id", :car_id, :time, :mph).order("time").limit(1)
    scoped
  end
end

我只想返回每辆车的最快圈速。

因此,我需要按 Lap.car_id 对 Laps 进行分组,然后仅返回基于该车的最快单圈时间,这将由 Lap.time 列确定

基本上我想将我的方法堆叠在我的控制器中:

@corvettes = Lap.by_carmodel("Corvette").fastest_per_car

希望这是有道理的......

当尝试仅运行Lap.fastest_per_car时,我将所有内容限制为 1 个结果,而不是每辆车 1 个结果。

我必须做的另一件事是添加“laps.id”,因为 :id 在我的结果中也显示为空。如果我只是 select(:id) 它说的是模棱两可

4

3 回答 3

1

我认为一个不错的方法是添加一个基于有效 SQL 语法的 where 子句,以返回最快的单圈。

像这样的相关子查询......

select ...
from   laps
where  id = (select   id
             from     laps laps_inner
             where    laps_inner.car_id = laps.car_id
             order by time asc,
                      created_at desc
             limit    1)

这有点复杂,因为需要在 created_at 上进行抢七。

rails 范围只是:

where("laps.id = (select   id
                  from     laps laps_inner
                  where    laps_inner.car_id = laps.car_id
                  order by time asc,
                           created_at desc
                  limit    1)")

car_id 上的索引非常重要,如果这是 (car_id, time asc) 上的复合索引,那就更好了。

于 2013-08-27T18:19:08.807 回答
0

您正在使用 limit 它将返回一个值。每辆车没有一个价值。要每圈返回一辆车的价值,您只需加入表格并按一组列分组,这些列将标识一圈(id 是最简单的)。

此外,您可以对 ActiveRecord 更友好:

class Lap < ActiveRecord::Base
  belongs_to :car

  def self.by_carmodel(carmodel)
    joins(:car_model).where(:car_models => {:name => carmodel})
  end

  def self.fastest_per_car
    joins(:car_model)
      .select("laps.*, MIN(car_models.time) AS min_time")
      .group("laps.id")
      .order("min_time ASC")
  end
end
于 2013-08-27T21:58:45.777 回答
0

这就是我所做的及其工作。如果有更好的方法来解决这些问题,请发布您的答案:

在我的模型中:

def self.fastest_per_car
    select('DISTINCT ON (car_id) *').order('car_id, time ASC').sort_by! {|ts| ts.time}
end
于 2013-09-03T16:01:08.013 回答