2014-12-27 151 views
0

我有2個車型之一返回計數元素列表和用戶 用戶的has_many上市 上市belongs_to的用戶中的has_many關係

我有一個視圖設置,我想顯示自己的房源計算每個用戶,我試試這個代碼:

<% User.all.each do |user| %> 
<%= user.listings.count %> 
<% end %> 

我想抓住每個用戶的清單計數。我在這裏發現了一堆解決方案,都返回循環。我嘗試的其他解決方案是創建一個類方法。

def count_listings 
    Listing.where(:user_id => user.id).count 
end 

試圖這樣調用<%= User.count_listings%>它不起作用。由於某種原因,我錯過了一些東西,不能完全弄明白。

回答

1

的:counter_cache選項可用於使找到屬於對象更有效的數量。考慮到這些機型:

class Order < ActiveRecord::Base 
    belongs_to :customer 
end 
class Customer < ActiveRecord::Base 
    has_many :orders 
end 

有了這些聲明,要求@ customer.orders.size的值需要使與數據庫的呼叫來執行COUNT(*)查詢。爲了避免這種調用,您可以添加一個計數器緩存到屬於模型:

class Order < ActiveRecord::Base 
    belongs_to :customer, counter_cache: true 
end 
class Customer < ActiveRecord::Base 
    has_many :orders 
end 

這一聲明,Rails會保持高速緩存值的更新,然後響應大小方法返回一個值。

雖然在包含belongs_to聲明的模型上指定了counter_cache選項,但實際列必須添加到關聯的模型中。在上述情況下,您需要將名爲orders_count的列添加到Customer模型。

class Order < ActiveRecord::Base 
    belongs_to :customer, counter_cache: :count_of_orders 
end 
class Customer < ActiveRecord::Base 
    has_many :orders 
end 

計數器緩存列添加到只讀通過attr_readonly屬性包含模型的列表:如果需要,您可以覆蓋默認的列名。

來源:Rails guide on associations ..scroll下降到belongs_to的

+0

請讓我知道,如果我的情況下是錯誤的選項,我張貼的答案後實現。 – jaspreet21anand

+0

還告訴你要優化n + 1查詢問題還是別的什麼。 – jaspreet21anand

+0

沒有你的背景是正確的方法,它很簡單,重點 –

1

如果你需要的是你的例子表明你可以做的更好如下

<% Listing.group(:user_id).count.each do |user, count| %> 
    <%= "user: #{user} has #{count} listings" %> 
<% end %> 

這確實一個數據庫查詢,只有你所需要的獲取。

SELECT COUNT(*) AS count_all, user_id AS user_id FROM `listings` GROUP BY user_id 

並返回如哈希:

{ 
    1: 123, 
    2: 231 
} 

#{ user_id: count }