2010-12-11 3 views
5

Je ces classes:Comment db: graine un modèle et tous ses modèles imbriqués?

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 

J'essaie d'insérer un enregistrement dans les 3 tables comme ceci:

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 enregistrement se users inséré dans la table, mais pas dans le user_profiles ou contacts tables. Aucune erreur ne se produit non plus.

Quelle est la bonne façon de faire une telle chose?

SOLVED (merci @Austin L. pour le lien)

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]) 

Répondre

3

Votre modèle utilisateur doit être configuré pour accepter les attributs imbriqués via accepts_nested_attributes

Consultez la documentation Rails pour plus d'informations et Exemples: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Modifier: Vous pouvez également envisager d'utiliser has_one :contact, :through => :user_profile qui vous permettrait d'accéder à la c Ontact comme ceci: @contact = User.first.contact.

Edit 2: Après avoir joué dans rails c la meilleure solution que je peux trouver est la suivante:

@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: Voir la question d'une meilleure solution.

+0

Oui, tout est mis en place (j'ai déjà les points de vue et ils fonctionnent tous très bien). Mais pourquoi cela échoue-t-il dans db: seed est le problème – Zabba

+0

avez-vous supprimé les 'accept_nested_attributes' de vos modèles lors de la publication ici? –

+0

Oui, je n'ai posté que l'essentiel des modèles. Je vais ajouter tous les détails. Excuses :) – Zabba

Questions connexes