我有以下表格:
我想显示用户及其相关帐户和图片。这是典型的N + 1查询问题,我使用eager loading解决了这个问题。
User.includes(:account, :pictures).all
我正在尝试使用will_paginate
gem。如何将此预先加载机制纳入will_paginate
?
我在这里找到了类似的问题:Using will_paginate with multiple models (Rails)。但答案中的链接不合适,答案本身已经过时了。此外,它使用原始的SQL查询,我不喜欢。
我想要输出如下:
user.name account.field1 account.field2 picture.count
abc1 abcf1 abcf2 4
zxc zxcf1 zxcf2 7
所以基本上当我做user.name
时,它不会执行查询而只是从变量中获取数据;
同样,当我user.account.field1
它应该从变量中获取它而不执行查询。
答案 0 :(得分:4)
paginate
方法类似于all
方法。所以你可以这样做:
User.includes(:account, :pictures).paginate(
:page => params[:page], :per_page => 30)
OR
User.paginate(:include=> [:account, :pictures],
:page => params[:page], :per_page => 30)
注意:强>
will_paginate
gem为Array
类提供了一种方便的分页方法:
[1,2,3,4].paginate(:page => 1, :per_page=>2)
答案 1 :(得分:1)
我最终在数组上使用了分页而不是宝石本身。
current_page = Integer(params[:page]||1)
per_page = 250
@users_r = User.all(:conditions=>"some condition",:limit=>per_page,:offset=>per_page*(current_page-1),:include=>[:account,:user_info ,:pictures])
count = @users_r.length
@users = WillPaginate::Collection.create(current_page, per_page, count) do |user|
user.replace(@users_r)
end
@users.paginate(params)