如何从活动记录集合中获取所有has_many关联

Rob*_*yes 4 database activerecord ruby-on-rails ruby-on-rails-4

我有两个has_many through关联模型; TaskflowsDatasets.他们有一个名为的连接表DatasetAssignments.

我使用以下命令获取所有Taskflow:

@taskflows = Taskflows.all

我知道可以从单个ActiveRecord对象获取关联,例如:

@taskflow.datasets

但是有可能Datasets@taskflowsActiveRecord集合中获取所有相关联的内容吗?如@taskflows.datasets

任何帮助将非常感激.

楷模:

class Dataset < ActiveRecord::Base
  has_many :dataset_assignments
  has_many :taskflows, :through => :dataset_assignments
end

class Taskflow < ActiveRecord::Base
  has_many :dataset_assignments
  has_many :datasets, :through => :dataset_assignments
end

class DatasetAssignment < ActiveRecord::Base
  belongs_to :dataset
  belongs_to :taskflow
end
Run Code Online (Sandbox Code Playgroud)

Nic*_*lov 6

鉴于这@taskflows是一个ActiveRecord::Relation,你可以这样做:

@datasets = Dataset.joins(:dataset_assignments).
    where(dataset_assignments: {taskflow: @taskflows.joins(:datasets) })
Run Code Online (Sandbox Code Playgroud)

或者,在另一个方向:

@taskflows = Taskflow.joins(:dataset_assignments).
    where(dataset_assignments: {dataset: @datasets.joins(:taskflows) })
Run Code Online (Sandbox Code Playgroud)

joinsINNER JOIN通过多对多表生成s,并使接收器成为ActiveRecord::Relation保存其他条件的实例.

正如@oreoluwa建议的那样,使用includes以下方法枚举时可以避免N + 1个查询:

@taskflows = Taskflow.joins(...).includes(:datasets)
Run Code Online (Sandbox Code Playgroud)