1

我有一个通知模型:

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

4

1 回答 1

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 )

于 2013-09-21T11:51:21.153 回答