Révision: J'ai révisé la réponse à utiliser avant de créer et de créer, sans créer, les modèles associés. La machine ActiveRecord prend alors soin d'enregistrer les modèles associés une fois le parent enregistré.
J'ai même testé ce code!
# in your Room model...
has_many :doors
before_create :build_main_door
private
def build_main_door
# Build main door instance. Will use default params. One param (:main) is
# set explicitly. The foreign key to the owning Room model is set
doors.build(:main => true)
true # Always return true in callbacks as the normal 'continue' state
end
####### has_one case:
# in your Room model...
has_one :door
before_create :build_main_door
private
def build_main_door
# Build main door instance. Will use default params. One param (:main) is
# set explicitly. The foreign key to the owning Room model is set
build_door(:main => true)
true # Always return true in callbacks as the normal 'continue' state
end
... Ajouté
La méthode de construction est ajoutée par les machines du modèle possédante par la déclaration has_many. Puisque l'exemple utilise has_many: doors (nom du modèle Door), l'appel de construction est doors.build
Voir les docs for has_many et has_one pour voir toutes les méthodes supplémentaires qui sont ajoutées.
# If the owning model has
has_many :user_infos # note: use plural form
# then use
user_infos.build(...) # note: use plural form
# If the owning model has
has_one :user_info # note: use singular form
# then use
build_user_info(...) # note: different form of build is added by has_one since
# has_one refers to a single object, not to an
# array-like object (eg user_infos) that can be
# augmented with a build method
Rails 2.x a introduit l'option d'enregistrement automatique pour les associations. Je ne pense pas que cela s'applique à ce qui précède (j'utilise par défaut). Autosave testing results.
Le modèle enfant dans mon exemple est appelé "user_info", quand j'essaie de faire user_info.create (: main => true) 'il erreurs et dit' undefined méthode \ 'créer 'pour nil: NilClass' – Reti
en fait, le modèle est techniquement appelé' userInfo' – Reti
Essayez 'UserInfo.create' – zetetic