您可以Array#from
用来模拟分页,但是真正的问题在于您根本不应该使用Array
。
这就是ActiveRecord关联的用途。您应该仔细阅读该指南,如果您正在开发Rails应用程序,则需要了解很多有用的东西。
让我向您展示做同一件事的更好方法:
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
重要的是您的数据库架构要遵循正确的命名约定,否则所有这些都将破坏。确保您正在使用数据库迁移创建表来而不要手工完成。
这些关联将在您的模型上创建帮助器,以使搜索更加容易。您可以使Rails使用named_scope
或scope
取决于您使用的是Rails 2.3还是3.0,而不是迭代OpinionRatings列表并手动收集用户,而无需使用Rails 2.3或3.0。由于您未指定,因此我将给出两个示例。将此添加到您的OpinionRating类:
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])
Rails 4.x的更新:大致相同:
scope :agreed, ->{ where agreed: true }
def self.for(id)
joins(:opinion).where(opinion: { id: id })
end
尽管对于较新的Rails,我更喜欢分页的kaminari:
@ratings = @ratings.page(params[:page])