1

我有一个notifications表格,我根据他们选择的频率将报告通过电子邮件发送给人们。

如果一个电子邮件地址存在于多个questions并且具有相同的frequency......那么我需要将它们组合在一起,以便我可以针对这两个问题发送一份报告。

[
   #<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 个报告:

  • 每天 1 到 john@example.com 获取问题的 58 和 25
  • 1 至 john@example.com 每月发送问题 47
  • 1 到 frank@example.org 每月回答问题 19

我可能没有很好地解释这一点,所以如果有什么需要澄清的,请告诉我。

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 回答