我正在尝试显示某个类别在列表中的照片数量。
对于它,我试图在我看来做:
<%= @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
由于
答案 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%>