правильный способ найти максимальное значение с помощью рельсов - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть следующие модели:

#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 ]

8 голосов
/ 20 декабря 2011

Если вы хотите, чтобы пробег для последнего установленного одометра оборудования вы сделали

# 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 является неявным.

Возможно, вы захотите реализовать что-то похожее на кеш счетчика , только для того, чтобы набрать максимальное количество, которое вы берете, чтобы ускорить запросы.

1 голос
/ 20 декабря 2011

Вы можете поместить это в модель вашего оборудования

class Equipment < ActiveRecord::Base

  belongs_to :odometer_type
  has_many :odometers

  def max_milage
    odometers.max(:mileage)
  end
end

Тогда вы можете получить к нему доступ как @equipment.max_milage

...