我有一个用户模型和一个照片模型。如果我进入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
答案 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])