ActiveRecord关联(has_one)-访问父对象

问题描述 投票:0回答:1
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"}]

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

但是无法在视图中访问父对象。有没有办法在每个孩子中包含父对象?

谢谢!

ruby ruby-on-rails-3
1个回答
0
投票

您对includes有点困惑。这将不包括对象,但会在需要时进行准备。

由于ParentChild之间有关联,因此您已经可以看到父母,但是这将要求每个孩子获得父母,因此您将在n + 1个查询中运行。

放入代码中:

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

将触发:

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

您在其中执行的操作将使其看起来像:

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

因此,如果要在视图中使用它,则实际上会出现类似@childrens的内容,所以不要害怕迭代并调用.parent

您可以阅读有关急切加载here的更多信息>

© www.soinside.com 2019 - 2024. All rights reserved.