我有一些Rails的模型,看起來有點像這樣使用相關模型的平均:ActiveRecord的:在查詢
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
是對的weighted_average
下方它屬於Widget
。例如,如果一個特定的小部件的平均價格爲5美元,並且有4美元,4.50美元和6美元的清單,我想返回前兩個 - 因爲它們低於平均價格並且代表好交易。
該查詢應產生所有小部件的所有價格低廉的清單的列表,我希望能夠在單個查詢中執行此操作。
我該如何使用ActiveRecord查詢來做到這一點?在理想的僞代碼,它會是這樣的:
Listing.where('listing.price < widget.weighted_average')
# Not possible, because weighted_average isn't a column in the DB, but a method.
你試過了:'Listing.where('price <?',widget.weighted_average)'? – Alireza 2014-10-28 18:26:47
什麼是'widgets.sum('value * stock')/ widgets.sum('stock')',或者更確切地說'weighted_average'方法中的'widgets'是什麼? – Surya 2014-10-28 18:40:52
我希望這適用於多個小部件,而不僅僅是單個小部件的列表。上面的建議將使用'where'子句的相同值,而不是列表的小部件的平均值。我也意識到我有'listing.sum',而不是'widgets.sum' - 我編輯了我的問題。 – 2014-10-28 19:53:17