如何分组和分页记录?

时间:2013-09-21 10:19:05

标签: ruby-on-rails kaminari

我有一个通知模型:

Notification(id: integer, notifiable_id: integer, notifiable_type: string, user_id: integer, created_at: datetime, updated_at: datetime)

通知控制器:

def index
  @notifications = current_user.notifications.page(params[:page]).per(10)
end

在视图中,它将记录显示为:

  

user1对post1发表了评论   user2对post1发表评论   user3订阅了blog1
  user4订阅了blog1

如何按notifiable进行分组以显示:

  

user1,user2对post1发表评论   user3,user4订阅了blog1

1 个答案:

答案 0 :(得分:3)

响应取决于您使用的数据库。

PostgreSQL的

对于postgres,您可以这样做:

@notifications = current_user.notifications.
                 select( "string_agg( users.user_name, ', ' ) as user_names, notifiables.name as notifiable_name" ).
                 group( 'notifiables.name, notifications.notifiable_type' ).
                 joins( :notifiable ).joins( :user ).
                 page(params[:page]).per(10)

然后,使用这样的聚合对象:

@notifications.map { |n| "#{n.user_names} #{n.notifiable_type} #{n.notifable_name}" }

请注意,我已经猜到了其他表字段名称,因此请相应调整。

基本思想是对结果进行分组并使用数据库连接功能。 Kaminari和will_paginate会很满意结果。

注意:与使用#select时一样,不要将对象写回数据库,否则它们将被破坏。

MySQL的

对于mysql,这应该基本相同,但用string_agg( users.user_name, ', ' )替换group_concat( users.user_name )