我有两个模型尝试在视图页面上呈现模型产品

时间:2017-07-23 00:39:18

标签: ruby-on-rails

我有两个模型,一个是placesblogs

我希望能够在blogs.title页面上呈现places.index.html

当我致电<%= place.blogs.title %>时,我得到:

  

Places#index中的NoMethodError

这是我调用index中所有地方的控制器:

class PlacesController < ApplicationController
  def index
    @places = Place.all
  end
end

这是我place的第一个模型:

class Place < ApplicationRecord
  has_many :blogs
end

这是我blog的第二个模型:

class Blog < ApplicationRecord
  belongs_to :place
  validates_presence_of :title, :body
end

这是我试图呈现的索引页面:

<h1>Place index with blogs</h1>

<% @places.each do |place| %>
  <%= place.country %>
  <%= place.state %>
  <%= place.blogs.title %>
<% end %>

1 个答案:

答案 0 :(得分:2)

place.blogs是一个Relation对象,其中包含与此特定Blog相关的所有Place

您需要告诉ActiveRecord提取查询中的所有相关Blog记录,以便它可以在最少的请求数中执行此操作。这称为eager loading

class PlacesController < ApplicationController
  def index
    @places = Place.includes(:blogs).all
  end
end

接下来,在模板中添加内部循环

<h1>Place index with blogs</h1>

<% @places.each do |place| %>
  <%= place.country %>
  <%= place.state %>
  <ul>
    <% place.blogs.each do |blog| %>
      <li><%= blog.title %></li>
    <% end %>
  </ul>
<% end %>

内部循环似乎可以独立工作而不使用includes,但这会导致每次循环都针对数据库启动新请求,这是一个严重的性能问题。