2

У меня есть следующие моделиRails 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 

Я хочу, чтобы включать в себя встроенные документы, в которых можно хранить несколько адресов офиса. Am ищет следующую структуру БД

{ 
    "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

Вы должны определить, что модель является встраивание объект офис и наоборот, объяснение здесь: 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 

Помните, что если вы собираетесь использовать одну форму для этих объектов, которые вы должны будете сделать вложенную форму, что-то вроде (или просто Google что-то вверх):

<%= 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

Смежные вопросы