2014-12-27 114 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 }