你可以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
重要的是您的数据库架构遵循正确的命名约定,否则这一切都会中断。确保您使用数据库迁移创建表,而不是手动创建表。
这些关联将在您的模型上创建助手,使搜索更容易。named_scope
您可以让 Rails 使用或scope
根据您使用的是 Rails 2.3 还是 3.0,而不是迭代 OpinionRatings 列表并手动收集用户。由于您没有指定,我将给出两个示例。将此添加到您的 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])