2015-04-24 44 views
1

我有一個視圖,顯示來自父項(組在我的情況下)和它的孩子(在我的情況下的行)的記錄,雖然它的工作,我覺得我不是這樣做正確的Rails MVC方式。Rails父子模型查看最佳實踐

我的車型有:

class Group < ActiveRecord::Base 
    has_many :lines, dependent: :destroy 
    belongs_to :user 
end 

class Line < ActiveRecord::Base 
    belongs_to :group 
end 

我的羣組控制器打印方式是:

def print 
    @groups = current_user.groups.order('position ASC').all 
end 

我打印的看法是:

<table class="table table-striped"> 
    <thead> 
    <tr> 
     <th>Description:</th> 
    </tr> 
    </thead> 
    <tbody> 
    <% @groups.each do |group| %> 
     <tr> 
     <td><h3><%= group.description %></h3></td> 
     </tr> 
     <% group.lines.each do |line| %> 
     <tr> 
      <td><%= line.description %></td> 
     </tr> 
     <% end %> 
    <% end %> 
    </tbody> 
</table> 

我的打印方法將返回所有組這是罰款就像索引方法一樣。它生成以下SQL:

SELECT "groups".* FROM "groups" WHERE "groups"."user_id" = ? ORDER BY position ASC [["user_id", 1]] 

在那裏我想我會錯是,我有我的打印驗證碼以上視圖

lines group.lines.each do |line| 

這個運行每個每次組,它生成這樣的另一個查詢(爲每個組:

SELECT "lines".* FROM "lines" WHERE "lines"."group_id" = ? [["group_id", 667] 

這似乎低效的,因爲該查詢正在運行很多次。我也告訴我,我的查詢實際上應該從我的控制器運行,而不是我的視圖(即正確的Rails/MVC方式)。

我該如何做得更好?

在此先感謝

回答

4

你需要做什麼叫做eager loading(而不是延遲加載),您需要指示軌道來查詢,而不是在循環獲取每個孩子事先所有的孩子,這可以很容易地渲染視圖

+0

感謝時,使用includes方法

def print @groups = current_user.groups.includes(:lines).order(position: :asc) end 

這樣,你將只能得到2個查詢(一個團體,一個用於線)和無查詢來完成。我當然不知道這一點。 我是否需要更改我的視圖,因爲它似乎仍在執行行查詢? – comphelp

+0

我發現我的問題。我在視圖中添加了一個訂單(自發布以來),這導致了多個查詢。當我將訂單移動到控制器時(與您的指示相結合),它可以很好地工作。乾杯 – comphelp