如何在对象数组上使用will_paginate?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

如何在对象数组上使用will_paginate

例如,在我的网站上,我有一个部分,用户可以评估意见。以下是我写的收集评价意见的用户的方法:

def agree_list
  list = OpinionRating.find_all_by_opinion_id(params[:id])
  @agree_list = []
  list.each do |r|
    user = Profile.find(r.profile_id)
    @agree_list << user
  end
end

提问于
用户回答回答于

will_paginate 3.0旨在利用ActiveRecord::RelationRails 3 中的新功能,因此它paginate仅在缺省情况下定义关系。它仍然可以和一个数组一起工作,但是你必须告诉rails需要那个部分。

在你的config/initializers里的will_paginate_array_fix.rb文件中,添加这个

require 'will_paginate/array'

然后可以在数组上使用

my_array.paginate(:page => x, :per_page => y)
用户回答回答于

你可以使用Array#from模拟分页,但这里真正的问题是你根本不应该使用Array

一个更好的方式:

class Profile < ActiveRecord::Base
  has_many :opinion_ratings
  has_many :opinions, :through => :opinion_ratings
end

class Opinion < ActiveRecord::Base
  has_many :opinion_ratings
end

class OpinionRating < ActiveRecord::Base
  belongs_to :opinion
  belongs_to :profile
end

2.3

named_scope :for, lambda {|id| 
  {
    :joins => :opinion,
    :conditions => {
      :opinion => { :id => id }
    }
  }
}

named_scope :agreed, :conditions => { :agree => true }
named_scope :with_profiles, :includes => :profile

3.0

scope :agreed, where(:agree => true)

def self.for(id)
  joins(:opinion).where(:opinion => { :id => id })
end

在这两种情况下,你可以调用for(id)OpinionRatings模型,并把它传递一个id:

2.3

@ratings = OpinionRating.agreed.for(params[:id]).with_profiles
@profiles = @ratings.collect(&:profile)

3.0

@ratings = OpinionRating.agreed.for(params[:id]).includes(:profile)
@profiles = @ratings.collect(&:profile)

你现在可以轻松地分页:

@ratings = @ratings.paginate(:page => params[:page])

所属标签

可能回答问题的人

Dingda

Dingda · 站长 (已认证)

LemonLu

社区 · 运营 (已认证)

滑稽园扛把子

Swoole · PHP开发工程师 (已认证)

扫码关注云+社区