2011-10-12 2 views
0

Comment sauvegarder (insérer) uniquement des objets associés sans sauvegarder (mettre à jour) l'objet de base?ActiveRecord RoR - Enregistrer uniquement les nouveaux objets associés

Par exemple, je veux juste enregistrer les numéros de téléphone, je ne veux pas réenregistrer/mettre à jour l'objet personne.

def create_numbers 
    #params => person_id => 41, person => {:phone_number => '12343445, 1234566, 234886'} 
    @person = params[:person_id] 
    nums = params[:person][:phone_numbers].split(',') 
    nums.each do |num| 
    @person.phone_numbers.build(:number => num) 
    end 
    @person.save #here I just want to save the numbers, I don't want to save the person. It has read only attributes 
end 

Modèles:

Person < ... 
    # id, name 
    belongs_to :school, :class_name => :facility 
    has_many :phone_numbers 
end 

PhoneNumber < ... 
    # id, number 
    belongs_to :person 
end 

C'est un peu d'un exemple stupide, mais il illustre ce que je suis en train d'accomplir

Répondre

2

Que diriez-vous @person.phone_numbers.create(:number => num)

L'inconvénient est que vous ne saurez pas si elle a échoué ou non - vous pouvez gérer cela, mais cela dépend de la façon dont vous voulez le gérer.

1

L'approche la plus simple consiste à remplacer votre build(:number => num) par create(:number => num), ce qui va générer et enregistrer immédiatement l'objet phone_number (en supposant qu'il soit validé).

Si vous devez les sauver après avoir créé l'ensemble (pour une raison quelconque), vous pouvez simplement faire quelque chose comme

@person.phone_numbers.each{|num| num.save} 
Questions connexes