2

我的 Rails 应用程序中有两个模型,用于跟踪不同商店的产品价格。它们在这里,但经过简化:

class Product < ActiveRecord::Base
    attr_accessor :name

    def latest_prices
        prices.where('created_at >= ?', 30.days.ago)
    end

    def average_price
        latest_prices.prices.map(&:value).sum / latest_prices.count
    end
end

class Price < ActiveRecord::Base
    attr_accessor :value, :shop_name, :created_at
    belongs_to :product
end

我现在想找到Price低于该产品当前平均值的所有对象。这基本上意味着所有Prices在过去 30 天内创建的价格低于最近平均价格的产品Product

这可能吗?我正在使用 Postgres。

编辑:我应该提到-我想从Price模型中实现此方法-也就是说,只能显示所有划算的价格,而不是所有划算的产品价格。

提前感谢您的帮助!

4

2 回答 2

1

在 ActiveRecord 中使用命名范围,您可以使用组合来获得您想要的内容:

class Product < ActiveRecord::Base
  attr_accessor :name
  has_many :prices
end

class Price < ActiveRecord::Base
  attr_accessor :value, :shop_name, :created_at
  belongs_to :product

  scope :latest, where('created_at >= ?', 30.days.ago)
  scope :less_than, lambda { |value| where("value < ?", value) }

  def good_deals
    latest.less_than(average('value'))
  end

end
于 2013-08-14T20:31:51.917 回答
0

尝试这个:

class Product < ActiveRecord::Base
  attr_accessor :name

  def your_query
    prices.where('created_at >= ?', 30.days.ago).where('value < ?', average_price)
  end

  def latest_prices
    prices.where('created_at >= ?', 30.days.ago)
  end

  def average_price
    latest_prices.prices.map(&:value).sum / latest_prices.count
  end

end
于 2013-08-14T20:15:09.573 回答