has_one

1対1の関連を宣言(has_one)

適応バージョン

  • 1.0.0
  • 1.1.0
  • 1.1.1
  • 1.1.6
  • 1.2.0
  • 1.2.6
  • 2.0.0
  • 2.0.1
  • 2.0.3
  • 2.1.0
  • 2.2.1
  • 2.3.2
  • 2.3.8
  • 3.0.0
  • 3.0.5
  • 3.0.7
  • 3.0.9
  • 3.1.0
  • 3.2.3
  • 3.2.8
  • 3.2.13
  • 4.0.0
  • 4.1.0
  • 4.2.1

説明

指定のクラスがこのクラスの子であることを宣言

使い方

rails3
has_one(関連モデル名, [オプション])
rails4
has_one(関連モデル名 [, scope ,オプション])

オプション

オプション説明バージョン
:class_name関連名と参照元のクラス名を異なるものにしたい場合に指定
:dependent値を:destroyにすると、参照先が削除される場合に参照元もDBから削除
:foreign_key
:primary_key参照先のテーブルに定義されている外部キーの名前を指定
:asポリモーフィック関連を定義
:through結合モデルの指定
:sourcehas_one :throughの元となるオブジェクトを指定
:source_typepolymorphicの指定
:validateオブジェクトが保存されると、バリデイトが実行される
:autosave親のオブジェクトが保存されると、ロードされたオブジェクトも保存
:inverse_of
:conditions参照元を検索する際の条件を設定。SQLのWHERE句にしている案件を文字列で定義rails3まで
:include関連モデルクラスのオブジェクトをロードする際、同時に読み込みたいモデルを指定rails3まで
:order関連をロードする際のソート順を設定rails3まで
:readonly読み込み専用のオブジェクトを生成したい場合はtrueを指定rails3まで
:selectカラムの指定rails3まで

追加されるメソッド

メソッド説明
association(force_reload = false)自分自身を参照しているオブジェクトを返す
オブジェクトが無い場合は、nilを返す
association=(associate)引数を参照元オブジェクトとして設定
それ以外の参照元との関連は破棄
build_association(attributes = {})新しいオブジェクトを作成
引数にはオブジェクトを生成するのに必要なパラメータを指定
この時点では保存されない
create_association(attributes = {})新しいオブジェクトを作成して保存
引数にはオブジェクトを生成するのに必要なパラメータを指定
create_association!(attributes = {})新しいオブジェクトを作成して保存
引数にはオブジェクトを生成するのに必要なパラメータを指定
エラー時に例外を発生

保存

参照先オブジェクトが未保存の場合
  • saveのタイミングで外部キーが設定され保存
  • 参照先オブジェクトが未保存であれば、saveのタイミングで自動的に保存
参照先オブジェクトが保存済みの場合
  • 保存済みの場合には、作成するタイミングで自動的にDBに保存

UserとProjectの関係
マイグレーションファイル
class CreateUsersProjectsTable < ActiveRecord::Migration
  def self.up
    create_table :users_projects, :id => false do |t|
      t.integer :user_id
      t.integer :project_id
    end
  end
  def self.down
    drop_table :users_projects
 vend
end
Userモデル
class User < ActiveRecord::Base
  has_one :project
end
Projectモデル
class Project < ActiveRecord::Base
  belongs_to :user
end
クラス名としてUserを指定
has_one :admin_user, :class_name => "User"
user_id = 2を抽出
has_one :user, :conditions => "user_id = 2"
逆順で並び替える
has_one :user, :order => "id DESC"
データを削除するときに関連するテーブルを削除
has_one :user, :dependent => :destroy
外部キーを指定
has_one :user, foreign_key => "blog_id"

ソースコード

ソースコードを見る
# File activerecord/lib/active_record/associations.rb, line 1307
def has_one(name, scope = nil, options = {})
  reflection = Builder::HasOne.build(self, name, scope, options)
  Reflection.add_reflection self, name, reflection
end

ソースコード検索