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
但是无法在视图中访问父对象。有没有办法在每个孩子中包含父对象?
谢谢!
您对includes
有点困惑。这将不包括对象,但会在需要时进行准备。
由于Parent
和Child
之间有关联,因此您已经可以看到父母,但是这将要求每个孩子获得父母,因此您将在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的更多信息>