Rails 3:将sort_by转换为延迟加载

时间:2013-01-26 00:21:15

标签: ruby-on-rails-3 activerecord lazy-loading

我有一系列用户,每个用户都会发帖子很多(帖子会收到“观看次数”),过去我会以各种方式对它们进行排序。

例如,以下是8位观看次数最多的用户:

@most_viewed = User.sort_by{|user| user.views}

然后在我的模型中,user.rb文件:

def views
    self.posts.sum(:views) || 0
end

过去一切正常。

问题是我的排序使用了sort_by方法,它与will_paginate gem的效果不佳,因为它返回的是Array而不是Relation。

如何在Rails 3,Active Record Relation,Lazy Loading风格中执行以下操作?例如,作为命名范围?

  • 至少有一个帖子的用户
  • 帖子总观看次数最多的用户
  • 拥有最多观看次数(不是总数)的帖子的用户
  • 拥有最新帖子的用户
  • 帖子数量最多的用户

1 个答案:

答案 0 :(得分:1)

您仍然可以对数组进行分页,但是您必须要求'will_paginate / array' 为此,您可以在config / initializers目录中创建一个文件(即:“will_paginate_array_fix.rb”)。将其添加为该文件中的唯一行:

require 'will_paginate/array'

重新启动服务器,您应该可以对普通的ruby数组进行分页。

你应该使用订单方法。这将通过SQL执行排序,从而首先提供更好的性能:)

User.order("users.views DESC")

或升序

User.order("users.views ASC")

这将返回一个关系,因此您可以添加其他内容,例如where子句,作用域等。

User.order("views DESC").where("name like 'r%'")

对于名称以r

开头的用户的有序列表

访问http://guides.rubyonrails.org/active_record_querying.html获取官方解释