我有一个通知模型:
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
答案 0 :(得分:3)
响应取决于您使用的数据库。
对于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,这应该基本相同,但用string_agg( users.user_name, ', ' )
替换group_concat( users.user_name )