使用关联轨道找到最大值的正确方法

时间:2011-12-19 20:31:59

标签: ruby-on-rails ruby-on-rails-3.1 associations max

我有以下型号:

#equipment.rb
class Equipment < ActiveRecord::Base
  belongs_to :odometer_type
  has_many :odometers
end

#odometer.rb
class Odometer < ActiveRecord::Base
  belongs_to :equipment

  # I am currently doing this to find the last mileage entered (which is wrong too cause I want the mileage from the max date entered)

  def self.current_reading(equipment)
    all.where(:equipment_id => equipment.id).max(:mileage)
  end  
end

在视图中看起来更糟糕,如下所示:

= @equipment.odometers.current_reading(@equipment)

我在想应该有更好的方法来做到这一点,但我似乎无法提出或找到任何东西。老实说,我甚至不确定如何搜索这样的东西。

感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

如果您想要设备的最后插入里程表的里程数

# assuming autoincrement id
@equipment.odometers.order('odometers.id DESC').limit(1).first.mileage

# assuming created_at column
@equipment.odometers.order('odometers.created_at DESC').limit(1).first.mileage

如果您想获取设备的最大里程表里程数:

@equipment.odometers.maximum(:mileage)

由于Equipment has_many :odometers关系,在上面的代码中:equipment_id => equipment.id条件是隐含的。

您可能希望实现与counter cache类似的内容,只是为了获取最大数量的内容,以加快查询速度。

答案 1 :(得分:1)

您可以将其放入您的设备型号

class Equipment < ActiveRecord::Base

  belongs_to :odometer_type
  has_many :odometers

  def max_milage
    odometers.max(:mileage)
  end
end

然后您可以像@equipment.max_milage

一样访问它