Revisado: Revisé la respuesta para usar before_create y compilar, no crear, los modelos asociados. La maquinaria ActiveRecord se encarga de guardar los modelos asociados una vez que se guarda el padre.
¡Incluso probé este código!
# 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
Agregado ...
El método de aumento es añadido por la maquinaria del modelo propietaria por la declaración has_many. Dado que el ejemplo utiliza has_many: puertas (nombre de modelo Puerta), la llamada de compilación es doors.build
Consulte docs for has_many y has_one para ver todos los métodos adicionales que se agregan.
# 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 introdujo la opción de autoguardado para las asociaciones. No creo que se aplique a lo anterior (estoy usando el valor predeterminado). Autosave testing results.
El modelo hijo en mi ejemplo se llama "user_info", cuando intento hacer 'user_info.create (: main => true)' comete un error y dice 'undefined método \ 'crear 'para nil: NilClass' – Reti
en realidad, el modelo se llama técnicamente' userInfo' – Reti
Pruebe 'UserInfo.create' – zetetic