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,但会准备它们以备不时之需。
因为您在 Parent
和 Child
之间有关联,您已经可以看到 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_json
和 include
选项来获得每个 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)
这对我有帮助!
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,但会准备它们以备不时之需。
因为您在 Parent
和 Child
之间有关联,您已经可以看到 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_json
和 include
选项来获得每个 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)
这对我有帮助!