144 votes

Ruby on Rails. Comment utiliser la méthode de .construire enregistrement actif dans un : appartient à la relation ?

J'ai été incapable de trouver une documentation sur l' .la méthode build dans les Rails (je suis actuellement en utilisant 2.0.2).

Par le biais de l'expérimentation, il semble que vous pouvez utiliser la méthode build pour ajouter un enregistrement dans une has_many relation avant d'enregistrement a été enregistré.

Par exemple:

class Dog < ActiveRecord::Base
  has_many :tags
  belongs_to :person
end

class Person < ActiveRecord::Base
  has_many :dogs
end

# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true

Cela permettra d'économiser à la fois du chien et de la balise avec les clés étrangères correctement. Cela ne semble pas fonctionner dans un belongs_to relation.

d = Dog.new
d.person.build # => nil object on nil.build

J'ai aussi essayé

d = Dog.new
d.person = Person.new
d.save # => true

La clé étrangère en Dog n'est pas définie dans ce cas, en raison du fait qu'au moment où il est enregistré, la personne n'a pas un id parce qu'il n'a pas encore été enregistrée.

Mes questions sont les suivantes:

  1. Comment intégrer le travail de sorte que les Rails sont assez intelligents pour comprendre comment sauvegarder les enregistrements dans l'ordre?

  2. Comment puis-je faire la même chose en belongs_to relation?

  3. Où puis-je trouver toute la documentation sur cette méthode?

Merci

158voto

BushyMark Points 1950

Où il est documenté:

À partir de la documentation de l'API en vertu de la has_many association "Module ActiveRecord::Associations::ClassMethods"

collection.construire(attributes = {}, ...) Retourne un ou plusieurs nouveaux objets de la type de collection qui ont été instanciée avec les attributs et lié à cet objet par l'intermédiaire d'un clé étrangère, mais n'ont pas encore été sauvé. Remarque: Cela ne fonctionne que si un associée objet existe déjà, non si c'est nul!

La réponse de bâtiment dans la direction opposée est légèrement modifié la syntaxe. Dans votre exemple avec les chiens,

Class Dog
   has_many :tags
   belongs_to :person
end

Class Person
  has_many :dogs
end

d = Dog.new
d.build_person(:attributes => "go", :here => "like normal")

ou même

t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")

Vous pouvez également utiliser create_dog de l'avoir sauvé instantanément (un peu comme le correspondant de "créer" la méthode, vous pouvez faire appel à la collecte)

Comment est-rails assez intelligent? C'est de la magie (ou, plus exactement, je ne sais pas, aimerait le savoir!)

52voto

nehpets Points 239
@article = user.articles.build(:title => "MainTitle")
@article.save

4voto

GarlicFries Points 2507

BushyMark est mort sur... je voulais juste ajouter ce lien (il se réfère à elle, et je l’ai trouvé très utile pour répondre à cela et semblables questions) : http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X