2013-10-10 5 views
1

У меня есть таблица notifications, где я отправляю сообщения по электронной почте людям по частоте, которую они выбрали.Как группировать строки на основе нескольких полей?

Если адрес электронной почты существует по нескольким questions и имеет то же самое frequency ..., тогда мне нужно сгруппировать их, чтобы я мог отправить один отчет для обоих вопросов.

[ 
    #<Notification id: 1, question_id: 58, email: "[email protected]", frequency: "daily">, 
    #<Notification id: 2, question_id: 25, email: "[email protected]", frequency: "daily">, 
    #<Notification id: 3, question_id: 47, email: "[email protected]", frequency: "monthly">, 
    #<Notification id: 3, question_id: 19, email: "[email protected]", frequency: "monthly"> 
] 

Так в моем примере данных, 3 отчеты будут отправлены:

  • 1 до [email protected] на вопрос 58-х и 25 на ежедневной основе
  • 1 к джон @ пример. ком на вопрос 47 ежемесячно
  • 1 к [email protected] на вопрос 19 ежемесячно

не может объяснить это очень хорошо, так что дайте мне знать, если что-то нуждается в разъяснении.

+0

Как «уведомление» соответствует вашим другим моделям? – dax

+0

Вопрос has_many Уведомления и Уведомления принадлежит _to Question – Shpigford

ответ

1

Вы можете добиться этого с регулярным group_by:

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

Это будет Сгруппируйте уведомления, как это:

@notifications = { 
    'daily:[email protected]' => [<Notification id: 1>, #etc.], 
    'monthly:[email protected]' => [# list of notifications], 
    'monthly:[email protected]' => [# 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 "[email protected]">,<Notification id: 2 frequency: "daily", email "[email protected]">], 
    [<Notification id: 3 frequency: "daily", email "[email protected]">], 
    [<Notification id: 4 frequency: "monthly", email "[email protected]">,<Notification id: 5 frequency: "monthly", email "[email protected]">], 
] 
Смежные вопросы