2010-12-11 5 views
5

Ho queste classi:Come db: seminare un modello e tutti i suoi modelli annidati?

class User 
    has_one :user_profile 
    accepts_nested_attributes_for :user_profile 
    attr_accessible :email, :password, :password_confirmation, :user_profile_attributes 
end 

class UserProfile 
    has_one :contact, :as => :contactable 
    belongs_to :user 
    accepts_nested_attributes_for :contact 
    attr_accessible :first_name,:last_name, :contact_attributes 
end 

class Contact 
    belongs_to :contactable, :polymorphic => true 
    attr_accessible :street, :city, :province, :postal_code, :country, :phone 
end 

Sto cercando di inserire un record in tutte e 3 le tabelle come questo:

consumer = User.create!(
    [{ 
    :email => '[email protected]', 
    :password => 'aaaaaa', 
    :password_confirmation => 'aaaaaa', 
    :user_profile => { 
     :first_name => 'Gina', 
     :last_name => 'Davis', 
     :contact => { 
     :street => '221 Baker St', 
     :city => 'London', 
     :province => 'HK', 
     :postal_code => '76252', 
     :country => 'UK', 
     :phone => '2346752245' 
    } 
    } 
}]) 

Un record viene inserito nel users tavolo, ma non nel user_profiles o contacts tabelle. Nessun errore si verifica neanche.

Qual è il modo giusto per fare una cosa del genere?

risolto (grazie @Austin L. per il link)

params = { :user => 
    { 
    :email => '[email protected]', 
    :password => 'aaaaaa', 
    :password_confirmation => 'aaaaaa', 
    :user_profile_attributes => { 
     :first_name => 'Gina', 
     :last_name => 'Davis', 
     :contact_attributes => { 
      :street => '221 Baker St', 
      :city => 'London', 
      :province => 'HK', 
      :postal_code => '76252', 
      :country => 'UK', 
      :phone => '2346752245' 
      } 
     } 
    } 
} 
User.create!(params[:user]) 

risposta

3

Il modello utente deve essere configurato per accettare gli attributi nidificati via accepts_nested_attributes

consultare la documentazione Rails per maggiori informazioni e Esempi: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Modifica: Si potrebbe anche prendere in considerazione l'utilizzo di has_one :contact, :through => :user_profile che consentirebbe di accedere al c in questo modo: @contact = User.first.contact.

Edit 2: Dopo aver suonato in giro per rails c la soluzione migliore che posso trovare è questo:

@c = Contact.new(#all of the information) 
@up = UserProfile.new(#all of the information, :contact => @c) 
User.create(#all of the info, :user_profile => @up) 

Edit 3: Vedere la domanda per una soluzione migliore.

+0

Sì, è tutto impostato (ho già le viste e funzionano tutte bene). Ma perché fallisce in db: seed è il problema – Zabba

+0

hai rimosso il 'accept_nested_attributes' dai tuoi modelli quando postati qui? –

+0

Sì, ho postato solo l'essenza dei modelli. Aggiungerò tutti i dettagli. Scuse :) – Zabba

Problemi correlati