2016-11-25 71 views
1

说我有两个型号:Mongoid:如何设置嵌入对象(embeds_one关系)没有坚持

class Person 
    include Mongoid::Document 
    embeds_one :address 
end 

class Address 
    include Mongoid::Document 
    embedded_in :person 
end 

我想设置一个创建person的地址,而address被保存到数据库。

person.address = Address.new # Automatically persists address to the database. 

我的问题是基本相同this one,除了这是一个embeds_one关系,所以build方法不可用。我已经看到了动态创建build_<embedded_object>方法,但它似乎并不接受相同的选项build,即特定的类与构建嵌入式对象(这是相关类的子类):

person.posts.build({ 
    name: "Another post" 
}, SpecialPost) 
# Works 

person.build_address({ 
    name: "An address" 
}, SpecialAddress) 
# Does not work 
+0

这个'person.address = Address.new'不会将地址保存到db,直到你调用'save'。对? –

+0

如果'人'已经持续存在,是的,它确实存在。 – mlovic

+0

所以,这意味着,如果您使用'person.address = Address.new'分配'address',然后执行'person.reload',则可以访问'person.address'? –

回答

1

在人包埋的地址不会被默认坚持,当你运行

Person.new(...)

将只能坚持,如果你添加自动构建是真实

embeds_one :address, autobuild: true

,还可以设置

validates_presence_of :address

后者将确保将在数据库中存在。

或者您可以将地址分配给人物而不保存。