Ruby on rails 如何从一个活动记录集合中获取所有与多个关联
我有两个与Ruby on rails 如何从一个活动记录集合中获取所有与多个关联,ruby-on-rails,database,ruby-on-rails-4,activerecord,Ruby On Rails,Database,Ruby On Rails 4,Activerecord,我有两个与有很多关联的模型任务流和数据集。它们有一个名为DatasetAssignments的联接表 我使用以下方法获取所有任务流: @taskflows=taskflows.all 我知道可以从单个ActiveRecord对象获取关联,例如: @taskflow.dataset 但是可以从@taskflowsActiveRecord集合中获取所有相关的数据集吗?例如@taskflows.dataset 任何帮助都将不胜感激 型号: class Dataset < ActiveRecord
有很多关联的模型<代码>任务流
和数据集
。它们有一个名为DatasetAssignments
的联接表
我使用以下方法获取所有任务流:
@taskflows=taskflows.all
我知道可以从单个ActiveRecord对象获取关联,例如:
@taskflow.dataset
但是可以从@taskflows
ActiveRecord集合中获取所有相关的数据集吗?例如@taskflows.dataset
任何帮助都将不胜感激
型号:
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
类数据集:数据集\u分配
结束
类Taskflow:数据集\u分配
结束
类DatasetAssignment
我认为没有办法做到这一点,除非您有一个外部模型,我们称之为用户,其中:
User
has_many :taskflows
has_many :datasets, through: :taskflows
或者最好让您的DatasetAssignment
属于该用户,并获取特定用户的所有dataset\u分配
另一种方法是执行@taskflows.map(&:datasets)
,但效率不高
或者,如果您只需要数据集
在某个地方进行渲染,并且担心效率问题,则应使用AR#includes
方法,如:
@taskflow.includes(:数据集)
鉴于@taskflows
是一个ActiveRecord::Relation
,您可以执行以下操作:
@datasets = Dataset.joins(:dataset_assignments).
where(dataset_assignments: {taskflow: @taskflows.joins(:datasets) })
或者,在另一个方向:
@taskflows = Taskflow.joins(:dataset_assignments).
where(dataset_assignments: {dataset: @datasets.joins(:taskflows) })
连接
通过多对多表生成内部连接
s,并且让接收方作为ActiveRecord::Relation
的实例将保留其他条件
正如@oreoluwa所建议的,在使用includes
进行枚举时,可以避免N+1查询:
@taskflows = Taskflow.joins(...).includes(:datasets)
谢谢,执行@datasets.joins(:taskflows)
和@datasets.joins(@taskflows)
之间有区别吗?@taskflows来自上一个查询?等等,这有问题。你的成绩和你的接受者一样。当@datasets
是接收器时,数据集就是您所得到的,但您需要任务流。