我有三种模式:
Supplier
|
Price - Book
|
PriceType
价格是其他三个模型的联合表。
每月都会收集最新价格。因此,每个图书/供应商/价格类型组合都有多个价格,在不同的时间点收集。只有这个组合的最后价格是我感兴趣的价格。
我现在想知道,特定PriceType /供应商组合的所有图书的平均价格是多少,忽略除特定组合的最后价格之外的所有价格。
有没有办法在数据库(Postgres)级别上执行此操作,而不是像这样写一些非常慢的东西:
prices = []
Supplier.first.books.each do |book|
latest_price_for_book = Price.joins(:price_type, :book).where("price_types.id = ? AND books.id = ?", PriceType.first, book).last
prices << latest_price_for_book.price
end
average = prices.sum / prices.size.to_f
答案 0 :(得分:1)
我不知道你在哪里使用book
变量。你的代码与你的解释略有不同。无论如何,您可以使用聚合函数来获得更快的结果。
Price
.where("price_types.id = ? AND suppliers.id = ? AND books.id = ?",
@price_type, @supplier, @book)
.average(:<column_with_price>)
如果您想要每本图书的平均价格,那么您只需要group by
图书ID。