1

notifications選択した頻度に基づいてレポートを電子メールで送信するテーブルがあります。

複数のメール アドレスが存在し、それらがquestions同じである場合は、frequencyそれらをグループ化して、両方の質問に対して 1 つのレポートを送信できるようにする必要があります。

[
   #<Notification id: 1, question_id: 58, email: "john@example.com", frequency: "daily">, 
   #<Notification id: 2, question_id: 25, email: "john@example.com", frequency: "daily">,
   #<Notification id: 3, question_id: 47, email: "john@example.com", frequency: "monthly">,
   #<Notification id: 3, question_id: 19, email: "frank@example.org", frequency: "monthly">
] 

したがって、私のサンプル データでは、3 つのレポートが送信されます。

  • 質問の 58 と 25 については、毎日 john@example.com に 1 通
  • 質問 47 については、毎月 john@example.com に 1 通
  • 質問 19 については、毎月 frank@example.org に 1 通

うまく説明できていないかもしれませんので、説明が必要な場合はお知らせください。

4

1 に答える 1

1

これは、通常の group_by で実現できます。

@notifications = your_method_to_retrieve_notifications
@notifications = @noticications.group_by do |notif|
  notif.ferquency + ':' + notif.email
end

これにより、次のように通知がグループ化されます。

@notifications = {
  'daily:john@example.com' => [<Notification id: 1>, #etc.],
  'monthly:john@example.com' => [# list of notifications],
  'monthly:frank@example.org' => [# list of notif]
}

頻度と電子メールでグループ化された通知のリストの配列のみが必要な場合は、上記のメソッドを使用してこれを追加します。

@notifications = your_method_to_retrieve_notifications
@notifications = @noticications.group_by do |notif|
  notif.ferquency + ':' + notif.email
end.values
# returns Array of arrays like:
[
  [<Notification id: 1 frequency: "daily", email "a@b.com">,<Notification id: 2 frequency: "daily", email "a@b.com">],
  [<Notification id: 3 frequency: "daily", email "xx@yy.com">],
  [<Notification id: 4 frequency: "monthly", email "a@b.com">,<Notification id: 5 frequency: "monthly", email "a@b.com">],
]
于 2013-10-10T16:23:22.080 に答える