我有两个模型,一个是places
和blogs
。
我希望能够在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 %>
答案 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
,但这会导致每次循环都针对数据库启动新请求,这是一个严重的性能问题。