我有以下视图来显示带有计数的类别
<% @categories.each do |category| %>
<% category.sub_categories.sort.each do |sub_category| %>
<li><%= link_to sub_category.name, "category/#{sub_category.slug}", title: sub_category.name.capitalize %> <%= sub_category.posts.where(status: 1).count %></li>
<% end %>
<% end %>
但我不认为在视图中使用where
并不是一个好主意。有没有其他方法可以执行此类操作。
我得到正确的计数,但我需要更好的方法来做到这一点。任何人都可以帮忙
答案 0 :(得分:0)
您的Post
模型应该有一个封装此状态逻辑的范围:
class Post < ActiveRecord::Base
def self.active
where(status: 1)
end
end
然后从视图中调用它:
sub_category.posts.active.count
答案 1 :(得分:0)
使用范围来做同样的事情,否则你的解决方案是正确的。你不需要做这个控制器。
scope :active_posts, lambda{ where(status: 1)}
答案 2 :(得分:0)
我看到的唯一问题是它会导致N + 1个查询,因为您对类别进行了1个查询,然后对另一个查询进行了查询。这个数量很少,但是以后可能会导致严重的性能问题。
1)我建议你研究一下“counter_cache”: - http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to
2)或者在激活/停用帖子时,创建一个方法,增加/减少帖子类别的属性(即“active_posts”)