ActiveRecord 关联 (has_one) - 访问 parent object

ActiveRecord Associations(has_one) - Access parent object

class Parent < ApplicationRecord
  has_one: child
end


class Child < ApplicationRecord
  belongs_to :parent
end


childrens = Child.includes(:parent)

puts childrens.to_json
[{"id":1,"parent_id":1,"name":"Jack"},{"id":2,"parent_id":2,"name":"Oleg"}]

在这种情况下,我们可以像这样访问 parent object:child.parent

但是无法访问 parent object 视图。 有没有办法在每个 child 中包含 parent object?

谢谢!

您对 includes 造成了一些混淆。这将不包括 objects,但会准备它们以备不时之需。

因为您在 ParentChild 之间有关联,您已经可以看到 parent,但这将请求 parent 每个 children 因此你将在 n+1 个查询中 运行。

将其放入代码中:

Child.all.each { |c| c.parent }; nil

将触发:

Parent Load (0.2ms)  SELECT  "parents".* FROM "parents" WHERE "parents"."id" =  LIMIT 1   [["id", 4750516]]
Parent Load (0.2ms)  SELECT  "parents".* FROM "parents" WHERE "parents"."id" =  LIMIT 1   [["id", 4772539]]
Parent Load (0.1ms)  SELECT  "parents".* FROM "parents" WHERE "parents"."id" =  LIMIT 1   [["id", 4806512]]

你在那里用 includes 做的会让它看起来像:

SELECT "children".* FROM "children"
Parent Load (3.3ms)  SELECT "parents".* FROM "parents" WHERE "parents"."id" IN (4750516, 4772539, 4806512)

所以,如果你想在视图中使用它,你实际上会有类似 @childrens 的东西,所以不要害怕迭代并调用 .parent.

您可以阅读有关预先加载的更多信息here

您可以使用 as_jsoninclude 选项来获得每个 child parent:

Child.includes(:parent).as_json(include: :parent)

为此,您收到了几个查询。一个为children,另一个为每个children parents(IN子句):

Child Load (1.0ms)  SELECT "children".* FROM "children"
Parent Load (1.2ms)  SELECT "parents".* FROM "parents" WHERE "parents"."id" IN (, )  [["id", 1], ["id", 2]]

您可以限制从数据库中检索的列(使用 select)以及 JSON object 中的每个 object(不t 应用 SQL 过滤器)。

Child.includes(:parent).as_json(include: :parent)

这对我有帮助!