Как объединить таблицы 1: N в рельсы и вместо нескольких строк для записи получить одну строку с дополнительным столбцом, содержащим массив идентификаторов из объединенной таблицы - PullRequest
0 голосов
/ 05 июля 2018

у меня 3 модели

class Mission < ActiveRecord::Base
  belongs_to :guild
end

class Guild < ActiveRecord::Base
    has_many :missions
    has_many :guild_coordinators, :dependent => :destroy
    has_many :coordinators, :through=> :guild_coordinators, :class_name => "Associate"
end

class GuildCoordinator < ActiveRecord::Base
  belongs_to :guild
  belongs_to :coordinator, :class_name => "Associate"
end

Если я делаю

Mission.joins (: guild =>: guild_coordinators)

Я получаю строки для каждой гильдии -> Ассоциация координаторов гильдии

Можно ли получить уникальные записи для миссий с объединенными гильдиями и в одном столбце получить идентификаторы всех координаторов в массиве?

редактировать: ожидаемый результат примерно такой:

#<ActiveRecord::Relation [#<Mission id: 13, fy: 2018, guild_id: 31, name: "test mission", status: 0, coordinators: [1,2,3,5,8]>

моя база данных postgres в качестве вывода мне нужно отношение Active Record для gem ajax-datatables-rails

1 Ответ

0 голосов
/ 06 июля 2018

С Postgresql вы можете использовать array_agg агрегатную функцию :

Mission.
  joins(guild: :guild_coordinators).
  select('missions.*, array_agg(guild_coordinators.id) as coordinators').
  group(:id)

И вы получите ровно ActiveRecord::Relation, который будет содержать (после вызова) Mission объектов с дополнительным полем coordinators: Array.

Второй вариант - использовать .includes, как показано в комментариях my или @ garrett-motzner.

...