Ruby on rails 3 Rails 3:将sort_by转变为延迟加载

Ruby on rails 3 Rails 3:将sort_by转变为延迟加载,ruby-on-rails-3,activerecord,lazy-loading,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不起作用,因为它返回的是数组而

我有一系列的用户,他们每个人都发了很多帖子(这些帖子都会收到“视图”),过去我用各种方式对它们进行了分类

例如,以下是8个浏览量最大的用户:

@most_viewed = User.sort_by{|user| user.views}
然后在我的模型中,user.rb文件:

def views
    self.posts.sum(:views) || 0
end
这在过去运作良好

问题是,我的排序使用了sort_by方法,这对will_paginate gem不起作用,因为它返回的是数组而不是关系

在Rails3、活动记录关系、延迟加载风格中,我如何做以下事情?例如,作为命名作用域

  • 至少有一篇文章的用户
  • 在其帖子上拥有最多总浏览量的用户
  • 拥有最多视图的帖子的用户(不是总数)
  • 拥有最新帖子的用户
  • 拥有最多帖子的用户

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

require 'will_paginate/array'
重新启动服务器,您应该能够对普通ruby阵列进行分页

您应该使用order方法。这将通过SQL执行排序,这首先会提供更好的性能:)

还是升序

User.order("users.views ASC")
这将返回一个关系,因此您可以添加其他内容,例如where子句、作用域等

User.order("views DESC").where("name like 'r%'")
对于名称以r开头的有序用户列表


有关官方解释,请访问

问题在于views属性是user.rb模型中的一个方法,而不是数据库本身。因此User.order(“users.views DESC”)会导致Mysql2::Error:未知列“users.views”.aha:),好的,我会在我的答案中添加一行,谢谢,这太棒了!让我的应用程序启动并运行。不过,我想知道,我是否做错了什么,因为我的排序生成数组而不是关联?有没有更优雅的方法呢?没有,如果你不能使用SQL进行排序,你必须使用ruby,ruby使用数组,所以它会将它转换成数组。你能接受我的回答吗?
User.order("views DESC").where("name like 'r%'")