массив рельсов используя группу + каждый - PullRequest
0 голосов
/ 17 января 2020

Вопрос: Как мне создать подобный сгруппированный массив?

event_id: 1, person_id: 1, tasks: [1, 2] 
event_id: 1, person_id: 2, tasks: [3] 
event_id: 2, person_id: 1, tasks: [4]

Данные:

Таблица задач:

enter image description here

Event.rb:

has_many :tasks
has_many :people

Task.rb

belongs_to :event

Person.rb

belongs_to :event

Я думаю сделать что-то вроде этого (не работает):

- @grouped_tasks = Task.all.group(:event_id, :person_id).each do |z|
  = z.event.id
  = z.member.id
  = z.tasks.collect{|r| r.task.name}.join(",")
  = z.tasks.pluck(:name)

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Если вы используете postgres, вы можете получить результат, используя следующий запрос.

Task.all.group(:event_id, :person_id).select("event_id,person_id,array_agg(id) as tasks")
1 голос
/ 17 января 2020

Вместо использования SQL "GROUP BY" с group(:event_id, :person_id) вы можете вместо этого сгруппировать результаты, используя Ruby с group_by. Таким образом, у вас есть каждая отдельная запись для каждой группы.

- task_groups = Task.all.group_by { |task| [task.event_id, task.person_id] }
- task_groups.each do |(event_id, person_id), tasks|
  = event_id
  = person_id
  = tasks.pluck(:id).join(', ')
  = tasks.pluck(:name).join(', ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...