简体   繁体   中英

N+1 query with rails polymorphic association

I have two models.

Album

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

Post (which has title attribute)

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

and here is my template

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

I tried to use :includes and :references to avoid N + 1 query.

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

But it seems like the N + 1 query still occurs. What's wrong with this?

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

You are trying eager loading in a polymorphic association.

Please refer the following site for more details

Polymorphic Association and Eager Loading Issues

please try

Album.all.includes(:post => :post_module)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM