如何基于user.photos.count创建范围

时间:2016-07-01 16:31:12

标签: ruby-on-rails scope

我有一个用户模型和一个照片模型。如果我进入Heroku控制台,我可以搜索数据库,例如:

u = User.find(2)
u.photos.count 
=> 25 

我想在我的User模型中创建一个范围,以便我可以根据他们的photos.count编号对用户进行排序,然后对用户进行分页。

Class User 

scope :photocount  ??????

UsersController 

def index
  @users = User.photocount.paginate(page: params[:page])
end

1 个答案:

答案 0 :(得分:0)

你想要的是counter_cache。将列photos_count添加到用户模型和Photo model:

belongs_to :user, counter_cache:true

然后你可以User.order(:photos_count).page(params[:page]) 详细了解计数器缓存in rails guides here

范围将如下所示:

scope :by_photos_count, ->{ order(:photos_count) }

如果没有计数器缓存,它仍然可能,但效率非常低:

User.joins('join (select user_id, count(*) as sort from photos group by user_id) as sort ON users.id=sort.user_id').order('sort.sort').page(params[:page])