2

我可以顯示商店內的物品及其評論。如何獲得評論最多的頂級項目?我的評論是在另一個數據庫表中比商店和項目。Ruby on Rails:根據大多數評論的平均評分來訂購用戶?

控制器

@shop = Shop.find(params[:id]) 
@item = Item.where(:shop_name => @shop.name) 

查看

<% @item.each do |u| %> 
    <%= u.reviews.average('rating') %> 
    <%= u.reviews.count %> 
<% end %> 

有一個簡單的方法,我可以爲了基於與大多數評論或東西的最高評級?或者,也許它更好地分開最高評價和大多數評論,並讓用戶點擊鏈接來過濾?

感謝

編輯:

所以我有一個shopitemreview表。

在我項目模型

has_many :reviews, as: :reviewable 
has_many :shops 

在我審查模式商店模式

belongs_to :user 

在我的評語表,其設定所以當用戶評論中的項目,它向數據庫添加了一條記錄,並且我使用與該條目相關聯的所有記錄的average,並顯示它與ati在商店裏。

+0

可以分享有關表格和模型的更多詳細信息,可能是一個很好的SQL查詢可以提供幫助。 –

+0

@EdgarsJekabsons我增加了一些細節,它是否更有意義? – hellomello

回答

4

如果我理解正確你ER模型,你可以試試這個:

@items = Item.where(:shop_name => @shop.name).joins(:reviews) 
    .select("items.id, avg(reviews.rating) as average_rating, count(reviews.id) as number_of_reviews") 
    .group("items.id") 
    .order("average_rating DESC, number_of_reviews DESC") 

可能有一些拼寫錯誤,但你的想法。也可能你會想要創建某種加權分數,否則在這種情況下,一個5星評論的項目將高於50個4星評論的項目。

另外,我在select塊中定義的所有自定義列都是字符串類型,所以如果您將對它們進行任何算術運算,則需要手動對這些列進行類型轉換。

+0

我正在測試這段代碼,並且在'average(reviews.rating)' – hellomello

+0

上獲得了錯誤函數。可能是AVG,我會更新我的答案。 –

+0

真棒這個作品!我假設從長遠來看,這種方法會非常緩慢? – hellomello