问题是我如何列出与每个项目相关的所有资产?
这是我到目前为止所拥有的: 我有一个项目模型和资产模型。一个项目可以有很多资产(由Carrier wave上传)
这是project.rb
class Project < ActiveRecord::Base
validates :title, length: { maximum: 150 } ,uniqueness: true, presence: true
has_many :assets
end
这里是asset.rb
class Asset < ActiveRecord::Base
mount_uploader :attachment, AttachmentUploader
belongs_to:project
end
在project_controller.rb的index方法中,我有以下实例变量:
class ProjectsController < ApplicationController
def index
@projects = Project.all
@assets = Asset.all
end
def project_params
params.require(:project).permit(:title,assets_attributes: [:id,:project_id,:attachment])
end
end
这是视图index.html.erb,它列出了与项目关联的所有资产
<% @projects.each do |project| %>
<td><%= project.title %></td>
<% @assets.each do |asset| %>
<td><%= asset.attachment.size %></td>
<% end %>
<% end %>
答案 0 :(得分:1)
您的观点应如下所示:
<% @projects.each do |project| %>
<td><%= project.title %></td>
<% project.assets.each do |asset| %>
<td><%= asset.attachment.size %></td>
<% end %>
<% end %>
不要忘记从控制器中删除@assets = Asset.all
,并考虑添加分页。
另外,为避免视图中的N + 1个查询,您可以执行
@projects = Project.includes(:assets) # you dont need .all, I think it's deprecated in rails 4 when you use it this way
在您的控制器中。这将在1个查询中加载所有需要的项目。
如果你只需要资产中的size属性,你可以这样做以提高效率:
@projects = Project.includes(:assets).select('projects.*, assets.size').references(:assets)