ruby on rails 4外键和关联访问另一个表的属性

时间:2014-08-06 13:43:18

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord foreign-key-relationship model-associations

问题是我如何列出与每个项目相关的所有资产?

这是我到目前为止所拥有的: 我有一个项目模型和资产模型。一个项目可以有很多资产(由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 %>

1 个答案:

答案 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)