will_paginate与多个表

时间:2011-09-06 05:34:28

标签: ruby-on-rails will-paginate

我有以下表格:

  1. 用户
  2. 帐户(用户has_one帐户)
  3. 图片(用户has_many图片)
  4. 我想显示用户及其相关帐户和图片。这是典型的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它应该从变量中获取它而不执行查询。

2 个答案:

答案 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)