使用.count rails显示每个类别的项目数

时间:2014-05-29 17:39:51

标签: ruby-on-rails count

我正在尝试显示某个类别在列表中的照片数量。

对于它,我试图在我看来做:

<%= @photos.zone.name("Zone1").count%>
<%= @photos.zone.name("Zone2").count%>
<%= @photos.zone.name("Zone3").count%>
<%= @photos.zone.name("Zone4").count%>

但这不起作用,我不知道这是否会对我的ddbb提出一百万次请求。

这是正确的方法吗?为每个类别制作范围?

更新

class Photo < ActiveRecord::Base
  # validate :validate_minimum_image_size
  has_many :tags , dependent: :destroy
  belongs_to :user
  belongs_to :category
  belongs_to :zone
  validates_presence_of :title, :description, :category, :zone
  acts_as_votable
  is_impressionable
  before_destroy { |record| record.tags.destroy_all if record.tags.any? }

class User < ActiveRecord::Base
  rolify
  has_many :photos
  has_many :tags, through: :photos

由于

3 个答案:

答案 0 :(得分:0)

这一行是错误的,因为您在集合上调用它,并且它无法正确表示您的数据模型。

<%= @photos.zone.name("Zone1").count%>

让我们说你想要获得每张照片的区域,你会做这样的事情:

<% @photos.each do |photo| %>
  <%= photo.zone.count %>
<% end %>

这仍然没有意义,因为您的关联声明照片属于某个区域。因此,照片每个数据模型只能有一个区域。

  class Photo
    # ...
    belongs_to :zone
  end

根据这些信息,我假设你想要显示区域,以及每个区域的照片数量。在这种情况下,你会做这样的事情:

<%= @zone.photos.count %>

或者,如果您想在同一页面上显示多个区域:

<% @zones.each do |zone| %>
  <%= zone.photos.count %>
<% end %>

您将如何准备数据?在你的控制器中你会做这样的事情:

@zone = Zone.includes(:photos).find(params[:id]) # assuming a /zones/:id path

或多个区域:

@zones = Zone.all.includes(:photos) # assuming a /zones/ path

您也可能希望显示按区域分组的照片,这是另一个故事。

答案 1 :(得分:0)

扩展 @ Mohamad的回答

最好的办法是使用counter_cache。在Photo模型集中设置counter_cahe =>true区域

class Photo < ActiveRecord::Base
  # validate :validate_minimum_image_size
  has_many :tags , dependent: :destroy
  belongs_to :user
  belongs_to :category
  belongs_to :zone,:counter_cache => true #here
  validates_presence_of :title, :description, :category, :zone
  acts_as_votable
  is_impressionable
  before_destroy { |record| record.tags.destroy_all if record.tags.any? }

end

然后在您的photo_counts表格中添加一列zones并像这样使用

<% @zones.each do |zone| %>

<%= zone.photo_counts %>

<%end%>

这可以避免 multiple requests DB 。查看此 Railscast 了解更多信息

希望它有所帮助!

答案 2 :(得分:0)

简单地
<%= @photos.select{|photo| photo.zone.name == "Zone1"}.count%>