2014-01-27 119 views
2

我有以下型号轨道4 MongoID嵌入文档

class Professional 
    include Mongoid::Document 
    field :first_name, type: String 
    field :last_name, type: String 
    field :company_name, type: String 
    field :address, type: String 


    validates :first_name, length: { minimum: 5, :message => "What" }, format: { with: /\A[a-zA-Z]+\z/, message: "only allows letters" } 
end 

我想包括一个嵌入文档在那里我可以存储多个办公地址。在寻找的DB

{ 
    "first_name": "Harsha", 
    "last_name": "MV", 
    "company_name": "Mink7", 
    "offices": [ 
    { 
     "name": "Head Office", 
     "address": "some address here" 
    }, 
    { 
     "name": "Off Site Office", 
     "address": "some large address here" 
    } 
    ] 
} 

回答

5

以下结构你必须定义该模型中嵌入Office对象,反之亦然,说明这里:http://mongoid.org/en/mongoid/docs/relations.html。我猜你需要1-N关系,这样专业人员才能嵌入多个办公室?在这种情况下,应该这样做。

专业模型

class Professional 
    include Mongoid::Document 
    field :first_name, type: String 
    field :last_name, type: String 
    field :company_name, type: String 
    field :address, type: String 


    validates :first_name, length: { minimum: 5, :message => "What" }, format: { with: /\A[a-zA-Z]+\z/, message: "only allows letters" } 

    embeds_many :offices, class_name: "Office" 
end 

办模型

class Office 
    include Mongoid::Document 
    field :name, type: String 
    field :address, type: String 

    embedded_in :professional, :inverse_of => :offices 
end 

请记住,如果你要使用一种形式为这些对象,你就必须做一个嵌套形式,类似的信息(或只是谷歌的东西了):

<%= form_for @professional, :url => { :action => "create" } do |p| %> 
    <%= o.text_field :first_name %> 
    <%= o.text_field :last_name %> 

    <%= o.fields_for :office do |builder| %> 
     <%= builder.text_field :name %> 
     <%= builder.text_field :address %> 
    <% end %> 
<% end %> 

注意:并没有进行测试。

+0

非常感谢。如果我想添加多个办公室,我可以添加两组字段,它会保存吗?我如何添加两组字段? –

+1

很高兴我能帮到你。我不确定这是否会起作用,也没有时间来尝试它。但是,您可以只做那个试验和错误,无论如何,您已经有了代码。=) – oskarno

+0

也许您也可以共享您的控制器,这应该有办公室空,从而不显示办公室的名称和地址。 – Dennis