Je n'ai trouvé aucune documentation sur la méthode .build dans Rails (j'utilise actuellement 2.0.2).
Grâce à l'expérimentation, il semble que vous puissiez utiliser la méthode de construction pour ajouter un enregistrement dans une has_many
relation avant que l'un ou l'autre enregistrement n'ait é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 enregistrera correctement le chien et l'étiquette avec les clés étrangères. Cela ne semble pas fonctionner dans une 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 Dog
n'est pas définie dans ce cas car au moment de son enregistrement, la nouvelle personne n'a pas d'identifiant car elle n'a pas encore été enregistrée.
Mes questions sont:
Comment la compilation fonctionne-t-elle pour que Rails soit suffisamment intelligent pour savoir comment enregistrer les enregistrements dans le bon ordre?
Comment puis-je faire la même chose dans une
belongs_to
relation?Où puis-je trouver de la documentation sur cette méthode?
Je vous remercie
la source
belongs_to
» et «Méthodes ajoutées parhas_one
» . Plus de documentation technique peut être trouvée dans la documentation de l'API:belongs_to
ethas_one
.Réponses:
Où il est documenté:
Depuis la documentation de l'API sous l'association has_many dans " Module ActiveRecord :: Associations :: ClassMethods "
La réponse à la construction dans la direction opposée est une syntaxe légèrement modifiée. Dans votre exemple avec les chiens,
ou même
Vous pouvez également utiliser create_dog pour le sauvegarder instantanément (un peu comme la méthode "create" correspondante que vous pouvez appeler sur la collection)
Comment les rails sont-ils suffisamment intelligents? C'est magique (ou plus exactement, je ne sais tout simplement pas, j'aimerais le découvrir!)
la source
find_by_email
etfind_by_column_name
. Il convertit la méthode que vous passez en chaîne, la dissèque et essaie de la faire correspondre avec les noms de colonne de votre table.la source