Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 Rails将多个连接合并到一个方法中_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Rails将多个连接合并到一个方法中

Ruby on rails Rails将多个连接合并到一个方法中,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的应用程序中有一个用户,可以有多个评估、计划和资料。在我的数据库中,它们之间已经存在关系。我希望在一个选项卡中显示所有这些,而不必多次查询数据库 我试着用一个方法将它们连接到一个表中,但没有成功。返回的错误如下:未定义的方法“joins”for# 我的最终目标是只记录从联接返回的所有对象,以便可以显示它们,而不是需要查询三个不同的变量,这会减慢我的加载时间。你知道这怎么可能吗 class User < ApplicationRecord has_many :materials, de

我的应用程序中有一个用户,可以有多个评估、计划和资料。在我的数据库中,它们之间已经存在关系。我希望在一个选项卡中显示所有这些,而不必多次查询数据库

我试着用一个方法将它们连接到一个表中,但没有成功。返回的错误如下:
未定义的方法“joins”for#

我的最终目标是只记录从联接返回的所有对象,以便可以显示它们,而不是需要查询三个不同的变量,这会减慢我的加载时间。你知道这怎么可能吗

class User < ApplicationRecord
  has_many :materials, dependent: :destroy
  has_many :plans, dependent: :destroy
  has_many :assessments, dependent: :destroy
end 

class Material < ApplicationRecord
  belongs_to :user
end

class Assessment < ApplicationRecord
  belongs_to :user
end

class Plan < ApplicationRecord
  belongs_to :user
end
class用户
如果您只想预加载关联,请使用
includes

class User < ApplicationRecord
  # ...

  scope :with_library, -> { includes(:materials, :assessments, :plans) }
end
预加载关联后,您可以将其用于
方法,用特定用户的所有资料、评估和计划填充单个数组:

class User < ApplicationRecord
  # ...

  def library
    [materials, assessments, plans].map(&:to_a).flatten(1)
  end
end

更多信息:

如果您只想预加载关联,请使用
includes

class User < ApplicationRecord
  # ...

  scope :with_library, -> { includes(:materials, :assessments, :plans) }
end
预加载关联后,您可以将其用于
方法,用特定用户的所有资料、评估和计划填充单个数组:

class User < ApplicationRecord
  # ...

  def library
    [materials, assessments, plans].map(&:to_a).flatten(1)
  end
end

更多信息:

首选
包含
而不是
加入
,除非您有特殊的理由这样做
includes
将消除N+1查询,同时仍在关联中构造可用记录:然后可以像其他方式一样循环遍历所有内容

然而,在这种情况下,听起来像是从一个
用户
实例开始工作:在这种情况下,
包括
(或
加入
)并没有真正的帮助——没有需要消除的N+1查询


虽然避免每显示一行(N+1)运行查询很重要,但一个查询和三个查询之间的差异可以忽略不计。(尝试将所有内容压缩在一起会花费更多的开销。)对于这种用法来说,这是不必要的。

首选
包含
而不是
连接
,除非您有特定的理由这样做
includes
将消除N+1查询,同时仍在关联中构造可用记录:然后可以像其他方式一样循环遍历所有内容

然而,在这种情况下,听起来像是从一个
用户
实例开始工作:在这种情况下,
包括
(或
加入
)并没有真正的帮助——没有需要消除的N+1查询

虽然避免每显示一行(N+1)运行查询很重要,但一个查询和三个查询之间的差异可以忽略不计。(将所有东西挤在一起会花费更多的开销。)对于这种用法,它只是不必要的

users = User.all.with_library
users.first.library
# => [ ... ]