Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何从一个活动记录集合中获取所有与多个关联_Ruby On Rails_Database_Ruby On Rails 4_Activerecord - Fatal编程技术网

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
是接收器时,数据集就是您所得到的,但您需要任务流。