Mongoid:嵌入文档在父级构造时自动初始化

Posted

技术标签:

【中文标题】Mongoid:嵌入文档在父级构造时自动初始化【英文标题】:Mongoid: embedded documents automatically initializing on construction of parent 【发布时间】:2011-11-09 05:48:05 【问题描述】:

有没有办法让嵌入式文档在 mongoid 构造时自动初始化?我的意思是给定嵌入车库文档的用户。我必须编写以下代码来完全设置用户与车库:

user = User.create!(name: "John")
user.build_garage
user.garage.cars << Car.create!(name: "Bessy")

有没有办法可以跳过调用user.build_garage

谢谢

【问题讨论】:

【参考方案1】:

Mongoid 3 有autobuild 选项,它告诉Mongoid 在关系被访问并且它是nil 时实例化一个新文档。

embeds_one :label, autobuild: true
has_one :producer, autobuild: true

【讨论】:

【参考方案2】:

您可以像这样向 User 模型添加回调:

class User
  ...
  after_initialize do |u|
    u.build_garage unless u.garage
  end
  ...
end

这个回调在类的每次实例化后触发,所以它在“find”和“new”之后触发。

【讨论】:

在找到好主意后触发,因为这不意味着它会覆盖以前的嵌入文档吗? 是否有任何 mongoid 汽车可以为用户执行此操作? 我编辑了答案以修正您的第一点。不,没有自动化。我会说这样的功能属于实际的应用程序代码。 老兄。你摇滚!我试图使用初始化方法来做到这一点。即使我先打电话给 super,但条件失败并添加了一个额外的文档。我要补充一点,也许你应该添加一个garage.exists?除非 Mongoid 3 现在有一个选项,autobuild

以上是关于Mongoid:嵌入文档在父级构造时自动初始化的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 ControlValueAccessor 的角度验证状态未在父级中正确传播,如何实现此验证?

使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象

Mongoid / Mongodb 和查询嵌入文档

Factory Girl + Mongoid 在夹具中嵌入文档

Mongoid查询嵌套embed文档通过属于和嵌入多个

所有嵌入文档都符合条件的 Mongoid 查询记录