instance method
has_one
Ruby on Rails 8.0.4
Since v2.2.3Signature
has_one(name, scope = nil, **options)
Specifies a one-to-one association with another class. This method should only be used if the other class contains the foreign key. If the current class contains the foreign key, then you should use #belongs_to instead. See Is it a belongs_to or has_one association? for more detail on when to use #has_one and when to use #belongs_to.
The following methods for retrieval and query of a single associated object will be added:
association is a placeholder for the symbol passed as the name argument, so has_one :manager would add among others manager.nil?.
association-
Returns the associated object.
nilis returned if none is found. association=(associate)-
Assigns the associate object, extracts the primary key, sets it as the foreign key, and saves the associate object. To avoid database inconsistencies, permanently deletes an existing associated object when assigning a new one, even if the new one isn’t saved to database.
build_association(attributes = {})-
Returns a new object of the associated type that has been instantiated with
attributesand linked to this object through a foreign key, but has not yet been saved. create_association(attributes = {})-
Returns a new object of the associated type that has been instantiated with
attributes, linked to this object through a foreign key, and that has already been saved (if it passed the validation). create_association!(attributes = {})-
Does the same as
create_association, but raises ActiveRecord::RecordInvalid if the record is invalid. reload_association-
Returns the associated object, forcing a database read.
reset_association-
Unloads the associated object. The next access will query it from the database.
Example
class Account < ActiveRecord::Base has_one :beneficiary end
Declaring has_one :beneficiary adds the following methods (and more):
account = Account.find(5) beneficiary = Beneficiary.find(8) account.beneficiary # similar to Beneficiary.find_by(account_id: 5) account.beneficiary = beneficiary # similar to beneficiary.update(account_id: 5) account.build_beneficiary # similar to Beneficiary.new(account_id: 5) account.create_beneficiary # similar to Beneficiary.create(account_id: 5) account.create_beneficiary! # similar to Beneficiary.create!(account_id: 5) account.reload_beneficiary account.reset_beneficiary
Scopes
You can pass a second argument scope as a callable (i.e. proc or lambda) to retrieve a specific record or customize the generated query when you access the associated object.
Scope examples:
has_one :author, -> { where(comment_id: 1) } has_one :employer, -> { joins(:company) } has_one :latest_post, ->(blog) { where("created_at > ?", blog.enabled_at) }
Options
The declaration can also include an options hash to specialize the behavior of the association.
Options are:
:class_name-
Specify the class name of the association. Use it only if that name can’t be inferred from the association name. So
has_one :managerwill by default be linked to the Manager class, but if the real class name is Person, you’ll have to specify it with this option. :dependent-
Controls what happens to the associated object when its owner is destroyed:
-
nildo nothing (default). -
:destroycauses the associated object to also be destroyed -
:destroy_asynccauses the associated object to be destroyed in a background job. WARNING: Do not use this option if the association is backed by foreign key constraints in your database. The foreign key constraint actions will occur inside the same transaction that deletes its owner. -
:deletecauses the associated object to be deleted directly from the database (so callbacks will not execute) -
:nullifycauses the foreign key to be set toNULL. Polymorphic type column is also nullified on polymorphic associations. Callbacks are not executed. -
:restrict_with_exceptioncauses an ActiveRecord::DeleteRestrictionError exception to be raised if there is an associated record -
:restrict_with_errorcauses an error to be added to the owner if there is an associated object
Note that
:dependentoption is ignored when using:throughoption. -
:foreign_key-
Specify the foreign key used for the association. By default this is guessed to be the name of this class in lower-case and “_id” suffixed. So a Person class that makes a #has_one association will use “person_id” as the default
:foreign_key.Setting the
:foreign_keyoption prevents automatic detection of the association’s inverse, so it is generally a good idea to set the:inverse_ofoption as well. :foreign_type-
Specify the column used to store the associated object’s type, if this is a polymorphic association. By default this is guessed to be the name of the polymorphic association specified on “as” option with a “_type” suffix. So a class that defines a
has_one :tag, as: :taggableassociation will use “taggable_type” as the default:foreign_type. :primary_key-
Specify the method that returns the primary key used for the association. By default this is
id. :as-
Specifies a polymorphic interface (See #belongs_to).
:through-
Specifies a Join Model through which to perform the query. Options for
:class_name,:primary_key, and:foreign_keyare ignored, as the association uses the source reflection. You can only use a:throughquery through a #has_one or #belongs_to association on the join model.If the association on the join model is a #belongs_to, the collection can be modified and the records on the
:throughmodel will be automatically created and removed as appropriate. Otherwise, the collection is read-only, so you should manipulate the:throughassociation directly.If you are going to modify the association (rather than just read from it), then it is a good idea to set the
:inverse_ofoption on the source association on the join model. This allows associated records to be built which will automatically create the appropriate join model records when they are saved. See Association Join Models and Setting Inverses for more detail. :disable_joins-
Specifies whether joins should be skipped for an association. If set to true, two or more queries will be generated. Note that in some cases, if order or limit is applied, it will be done in-memory due to database limitations. This option is only applicable on
has_one :throughassociations ashas_onealone does not perform a join. :source-
Specifies the source association name used by #has_one
:throughqueries. Only use it if the name cannot be inferred from the association.has_one :favorite, through: :favoriteswill look for a:favoriteon Favorite, unless a:sourceis given. :source_type-
Specifies type of the source association used by #has_one
:throughqueries where the source association is a polymorphic #belongs_to. :validate-
When set to
true, validates new objects added to association when saving the parent object.falseby default. If you want to ensure associated objects are revalidated on every update, usevalidates_associated. :autosave-
If
true, always saves the associated object or destroys it if marked for destruction, when saving the parent object. Iffalse, never save or destroy the associated object.By default, only saves the associated object if it’s a new record. Setting this option to
truealso enables validations on the associated object unless explicitly disabled withvalidate: false. This is because saving an object with invalid associated objects would fail, so any associated objects will go through validation checks.Note that NestedAttributes::ClassMethods#accepts_nested_attributes_for sets
:autosavetotrue. :touch-
If true, the associated object will be touched (the
updated_at/updated_onattributes set to current time) when this record is either saved or destroyed. If you specify a symbol, that attribute will be updated with the current time in addition to theupdated_at/updated_onattribute. Please note that no validation will be performed when touching, and only theafter_touch,after_commit, andafter_rollbackcallbacks will be executed. :inverse_of-
Specifies the name of the #belongs_to association on the associated object that is the inverse of this #has_one association. See Bi-directional associations for more detail.
:required-
When set to
true, the association will also have its presence validated. This will validate the association itself, not the id. You can use:inverse_ofto avoid an extra query during validation. :strict_loading-
Enforces strict loading every time the associated record is loaded through this association.
:ensuring_owner_was-
Specifies an instance method to be called on the owner. The method must return true in order for the associated records to be deleted in a background job.
:query_constraints-
Serves as a composite foreign key. Defines the list of columns to be used to query the associated object. This is an optional option. By default Rails will attempt to derive the value automatically. When the value is set the Array size must match associated model’s primary key or
query_constraintssize.
Option examples:
has_one :credit_card, dependent: :destroy # destroys the associated credit card has_one :credit_card, dependent: :nullify # updates the associated records foreign # key value to NULL rather than destroying it has_one :last_comment, -> { order('posted_on') }, class_name: "Comment" has_one :project_manager, -> { where(role: 'project_manager') }, class_name: "Person" has_one :attachment, as: :attachable has_one :boss, -> { readonly } has_one :club, through: :membership has_one :club, through: :membership, disable_joins: true has_one :primary_address, -> { where(primary: true) }, through: :addressables, source: :addressable has_one :credit_card, required: true has_one :credit_card, strict_loading: true has_one :employment_record_book, query_constraints: [:organization_id, :employee_id]
Parameters
-
namereq -
scopeopt = nil -
optionskeyrest
Source
# File activerecord/lib/active_record/associations.rb, line 1498
def has_one(name, scope = nil, **options)
reflection = Builder::HasOne.build(self, name, scope, options)
Reflection.add_reflection self, name, reflection
end
Defined in activerecord/lib/active_record/associations.rb line 1498
· View on GitHub
· Improve this page
· Find usages on GitHub
Defined in ActiveRecord::Associations::ClassMethods