2017-07-23 51 views
-1

我有兩個模型之一placesblogs我有兩個模型試圖呈現在查看頁面上的模型產品

我希望能夠在places.index.html頁面上呈現blogs.title

當我打電話<%= place.blogs.title %>我得到:

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 %> 

回答

2

place.blogs是包含所有Blog S中的關係對象與這個特定的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,但是這將導致對數據庫啓動新請求每個循環,這是一個嚴重的性能問題。