そのため、2番目の回答が投稿される前に少し何かを作成しましたが、少し忙しすぎて作成してここに置くことができませんでした. そして、私がここで正しいことをしたかどうか、それがスケールするかどうか、または全体的にどのように機能するかについては、まだ研究中です. 私がこれを実装した方法に対するすべてのアイデア、提案、コメントを聞きたいです。ここに行きます:
そこで、最初に典型的なポリモーフィック テーブルとしてテーブルを作成しました。
# migration
create_table :activities do |t|
t.references :receiver
t.references :user
t.references :notifiable
t.string :notifiable_type #
t.string :type # Type of notification like 'comment' or 'another type'
...
end
# user.rb
class User < ActiveRecord::Base
has_many :notifications, :foreign_key => :receiver_id, :dependent => :destroy
end
# notification.rb
class Notification < ActiveRecord::Base
belongs_to :receiver, :class_name => 'User'
belongs_to :user
belongs_to :notifiable, :polymorphic => true
COMMENT = 'Comment'
ANOTHER_TYPE = 'Another Type'
end
だからこれだけです。次に、ユーザーが特定の種類の通知を行うときのように、非常に一般的に挿入します。psql について私が見つけた新しい機能はARRAY_AGGです。これは、特定のフィールドを配列として新しいフィールドにグループ化する集計関数です (ただし、Rails に到達すると文字列になります)。したがって、レコードを取得する方法は次のようになります。
# notification.rb
scope :aggregated,
select('type, notifiable_id, notifiable_type,
DATE(notifications.created_at),
COUNT(notifications.id) AS count,
ARRAY_AGG(users.name) AS user_names,
ARRAY_AGG(users.image) as user_images,
ARRAY_AGG(id) as ids').
group('type, notifiable_id, notifiable_type, DATE(notifications.created_at)').
order('DATE(notifications.created_at) DESC').
joins(:user)
これは次のようなものを出力します:
type | notifiable_id | notifiable_type | date | count | user_names | user_images | id
"Comment"| 3 | "Status" |[date]| 3 | "['first', 'second', 'third']" |"['path1', 'path2', 'path3']" |"[1, 2, 3]"
そして、再び通知モデルに、基本的にそれらを配列に戻し、非一意のものを削除する次のメソッドがあります (特定の集約された通知で名前が 2 回表示されないようにするため):
# notification.rb
def array_of_aggregated_users
self.user_names[1..-2].split(',').uniq
end
def array_of_aggregated_user_images
self.user_images[1..-2].split(',').uniq
end
それから私の見解では、私はこのようなものを持っています
# index.html.erb
<% @aggregated_notifications.each do |agg_notif| %>
<%
all_names = agg_notif.array_of_aggregated_users
all_images = agg_notif.array_of_aggregated_user_images
%>
<img src="<%= all_images[0] %>" />
<% if all_names.length == 1 %>
<%= all_names[0] %>
<% elsif all_names.length == 2 %>
<%= all_names[0] %> and <%= all_names[1] %>
<% elsif all_names.length == 3 %>
<%= all_names[0] %>, <%= all_names[1] %> and <%= all_names[2] %>
<% else %>
<%= all_names[0] %> and <%= all_names.length - 1 %> others
<% end %>
<%= agg_notif.type %> on your <%= agg_notif.notifiable_type %>
<% if agg_notif.count > 1 %>
<%= set_collapsible_link # [-/+] %>
<% else %>
<%= set_actions(ids[0]) %>
<% end %>
<% end %>