Rob*_*yes 4 database activerecord ruby-on-rails ruby-on-rails-4
我有两个has_many through
关联模型; Taskflows
和Datasets
.他们有一个名为的连接表DatasetAssignments
.
我使用以下命令获取所有Taskflow:
@taskflows = Taskflows.all
我知道可以从单个ActiveRecord对象获取关联,例如:
@taskflow.datasets
但是有可能Datasets
从@taskflows
ActiveRecord集合中获取所有相关联的内容吗?如@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)
鉴于这@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)
joins
INNER JOIN
通过多对多表生成s,并使接收器成为ActiveRecord::Relation
保存其他条件的实例.
正如@oreoluwa建议的那样,使用includes
以下方法枚举时可以避免N + 1个查询:
@taskflows = Taskflow.joins(...).includes(:datasets)
Run Code Online (Sandbox Code Playgroud)