Unsaved objects and associations
You can manipulate objects and associations before they are saved to the database, but there is some special behavior you should be aware of, mostly involving the saving of associated objects.You can set the
:autosave
option on a has_one
,
belongs_to
, has_many
, or
has_and_belongs_to_many
association. Setting it to
true
will always save the members, whereas setting it
to false
will never save the members. More details
about :autosave
option is available at AutosaveAssociation.One-to-one associations
-
Assigning an object to a
has_one
association automatically saves that object and the object being replaced (if there is one), in order to update their foreign keys - except if the parent object is unsaved (new_record? == true
).
-
If either of these saves fail (due to one of the objects being invalid), an
ActiveRecord::RecordNotSaved
exception is raised and the assignment is cancelled.
-
If you wish to assign an object to a
has_one
association without saving it, use thebuild_association
method (documented below). The object being replaced will still be saved to update its foreign key.
-
Assigning an object to a
belongs_to
association does not save the object, since the foreign key field belongs on the parent. It does not save the parent either.
Collections
-
Adding an object to a collection (
has_many
orhas_and_belongs_to_many
) automatically saves that object, except if the parent object (the owner of the collection) is not yet stored in the database.
-
If saving any of the objects being added to a collection (via
push
or similar) fails, thenpush
returnsfalse
.
-
If saving fails while replacing the collection (via
association=
), anActiveRecord::RecordNotSaved
exception is raised and the assignment is cancelled.
-
You can add an object to a collection without automatically saving it by
using the
collection.build
method (documented below).
-
All unsaved (
new_record? == true
) members of the collection are automatically saved when the parent is saved.
Customizing the query
Associations are built fromRelation
s, and you can use the Relation
syntax to customize them. For example, to add a condition:
class Blog < ActiveRecord::Base
has_many :published_posts, -> { where published: true }, class_name: 'Post'
end
Inside the -> { ... } block you can use all of the usual Relation methods.
No comments:
Post a Comment