ActiveRecord:使用查询中相关模型的平均值

时间:2014-10-28 18:13:41

标签: sql ruby-on-rails rails-activerecord

我有一些看起来像这样的Rails模型:

class Manufacturer
  has_many :widgets
end

class Widget
  belongs_to :manufacturer
  has_many :listings

  def weighted_average
    listings.sum('value * stock') / listings.sum('stock')
  end
end

class Listing
  # Represents that a merchant is selling some widgets
  belongs_to :widget
  belongs_to :merchant
  # Model has a :price, eg. $5.99
  # Also has a :stock, eg. 45 units
end

我现在想要找到Listing低于其所属Listing#value的{​​{1}}的所有weighted_average个对象。

例如,如果某个特定小部件的平均价格为5美元,并且有4美元,4.50美元和6美元的商品,我希望返回前两个 - 因为它们低于平均价格并代表一个很好的协议。

查询应该为所有小部件生成所有价格低廉的列表的列表,并且我希望能够在单个查询中执行此操作。

如何使用ActiveRecord查询执行此操作?在理想的伪代码中,它类似于:

Widget

1 个答案:

答案 0 :(得分:0)

尝试:

Listing.joins(:widget).where("#{Listing.table_name}.price < ?", 15)

编辑:

必须用加权平均函数结果替换数字。根据您使用的数据库,它可以是一个SQL查询,它可以准确返回您想要的内容。例如,需要PostgreSQL HAVING子句。