Skip to main content
 首页 » 编程设计

ruby中如何加入1 :N tables in rails and instead of multiple rows for record get one row with extra column containing array of IDs from joined table

2025年05月04日41jillzhang

我有 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)

我为每个行会 -> 行会协调员协会获取行

是否可以获取已加入公会的任务的唯一记录,并在一列中获取数组中所有协调员的 ID?

编辑: 预期结果是这样的:

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

我的数据库是postgres 作为输出,我需要 gem ajax-datatables-rails 的 Active Record 关系

请您参考如下方法:

使用 Postgresql,您可以使用 array_agg aggregate function :

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

你得到的正是 ActiveRecord::Relation,它将包含(调用后)Mission 对象以及附加字段 coordinators:Array。

第二个选项是使用 .includes 就像我或 @garrett-motzner 评论所示。