2013-07-23 107 views
5

我有兩個模型。N + 1查詢與rails多態關聯

專輯

class Album < ActiveRecord::Base 
    has_one :post, as: :post_module, dependent: :destroy 
end 

後(其中有標題屬性)

class Post < ActiveRecord::Base 
    belongs_to :post_module, polymorphic: true 
end 

,這裏是我的模板

<% @albums.each do |album| %> 
    <tr> 
    <td> 
     <%= link_to album.post.title, edit_admin_album_path(album) %>&nbsp;<br/> 
    </td> 
    </tr> 
<% end %> 

我試圖用:includes:references避免ñ +1查詢。

def index 
    @albums = Album.includes(:post).references(:post).to_a 
end 

但它似乎仍然發生N + 1查詢。這有什麼問題?

SQL (0.2ms) SELECT `albums`.`id` AS t0_r0, `albums`.`product_num` AS t0_r1, `albums`.`created_at` AS t0_r2, `albums`.`updated_at` AS t0_r3, `posts`.`id` AS t1_r0, `posts`.`title` AS t1_r1, `posts`.`date` AS t1_r2, `posts`.`post_module_id` AS t1_r3, `posts`.`post_module_type` AS t1_r4, `posts`.`created_at` AS t1_r5, `posts`.`updated_at` AS t1_r6 FROM `albums` LEFT OUTER JOIN `posts` ON `posts`.`post_module_id` = `albums`.`id` AND `posts`.`post_module_type` = 'Album' 
Post Load (0.3ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`post_module_id` = 18 AND `posts`.`post_module_type` = 'Album' ORDER BY `posts`.`id` ASC LIMIT 1 
Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`post_module_id` = 20 AND `posts`.`post_module_type` = 'Album' ORDER BY `posts`.`id` ASC LIMIT 1 
Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`post_module_id` = 21 AND `posts`.`post_module_type` = 'Album' ORDER BY `posts`.`id` ASC LIMIT 1 
Post Load (0.2ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`post_module_id` = 22 AND `posts`.`post_module_type` = 'Album' ORDER BY `posts`.`id` ASC LIMIT 1 
Post Load (0.1ms) SELECT `posts`.* FROM `posts` WHERE `posts`.`post_module_id` = 23 AND `posts`.`post_module_type` = 'Album' ORDER BY `posts`.`id` ASC LIMIT 1 
+0

看來N + 1的時候我不叫'album.post.title」中甚至出現與@album = Album.all – synthresin

+0

每個循環嘗試Album.includes(張貼)僅 –

+0

這讓我同樣的結果:( – synthresin

回答