2014-10-28 90 views
0

我有一些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. 
+0

你試過了:'Listing.where('price <?',widget.weighted_average)'? – Alireza 2014-10-28 18:26:47

+0

什麼是'widgets.sum('value * stock')/ widgets.sum('stock')',或者更確切地說'weighted_average'方法中的'widgets'是什麼? – Surya 2014-10-28 18:40:52

+0

我希望這適用於多個小部件,而不僅僅是單個小部件的列表。上面的建議將使用'where'子句的相同值,而不是列表的小部件的平均值。我也意識到我有'listing.sum',而不是'widgets.sum' - 我編輯了我的問題。 – 2014-10-28 19:53:17

回答

0

嘗試:

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

編輯:

號碼必須與您的加權平均函數的結果來代替。根據你使用的數據庫,它可以是一個SQL查詢,它返回你想要的。例如,對於PostgreSQL HAVING子句是必需的。

+0

我已經更新了我的問題,使其更清晰一些 - 查詢應該爲所有小部件生成所有價格低廉的列表的列表,並且希望能夠在單個查詢中執行此操作。該數字是動態的,需要在查詢中查找,而不是傳入變量。 – 2014-10-28 19:56:59

+0

然後看看'HAVING'條款。 – blelump 2014-10-28 22:20:27