そもそもhas_oneとは?
対象を1つだけ持っている場合に使う。「1:1」の関連を定義するために使用します。
思想
一応、1:1と言ってもどちらかのテーブルに外部キーを持たせます。普通は主従関係を持つので「従」の方に外部キーを持たせます。
定義
主モデル側の設定
主モデル側に「has_one」を設定します。
1 2 3 |
class 主モデル名 < ActiveRecord::Base has_one :従モデル(単数形) end |
従モデル側の設定
従モデル側は「belongs_to」を使います。
1 2 3 |
class 従モデル < ActiveRecord::Base belongs_to :主モデル(単数系) end |
実装
下記のように呼び出せます。
1 |
主モデル.find(1).従モデル.従モデルのカラム名 |
has_oneのオプション
概要
オプション名 | 説明 | デフォルト値 |
---|---|---|
class_name | 関連するモデルクラス名を指定。関連名と参照先のクラス名を分けたい場合に使用する。モデル名とプログラムで使用しているインスタンス名が異なり、プログラム上での可読性が下がるのであまり使うことはない。 | |
foreign_key | 参照先テーブルの外部キーのカラム名 | |
primary_key | 参照元(自分)のテーブルの外部キーのカラム名 | idカラムが選ばれる。 |
dependent | 親と子の依存関係を指定する。
親を削除した際に親と子をまとめて削除したい場合は「dependent: :destroy」を指定します。 |
|
belongs_toとは?
自分が対象に所属している場合に使う。
belongs_toの構文
1 |
belongs_to 親モデル名,スコープ,オプション |
スコープ名
省略は可能、以下の構文でブロックを指定して関連づけるために取り出すレコードを指定できる。
1 |
-> {クエリメソッド} |
オプション
省略は可能
実装
単一の親モデルが返る。
1 |
子モデル.find(1).親モデル |
belongs_toのオプション概要
オプション名 | 説明 | デフォルト値 |
---|---|---|
class_model | 関連するモデルクラスを指定する。関連名と参照先のクラス名を分けたい場合に使う。必ずforeign_keyオプションも設定することとする。モデル名とプログラムで使用しているインスタンス名が異なり、プログラム上での可読性が下がるのであまり使うことはない。 | |
foreign_key | 参照先テーブルの外部キーのカラム名 | |
primary_key | 参照元(自分)のテーブルの外部キーのカラム名、このオプションを省略した場合は「idカラム」が選ばれる。 | idカラムが選択される。 |
optional | trueを指定すると参照先のテーブルのデータがない場合にエラーにならない。デフォルトはfalseなのでエラーになる。 | false |
autosave | 関連づけているモデルが保存される度に保存される。 | |
counter_cache | サイズ取得にキャッシュを利用するよう指定する。(SQLが発行されないため処理効率が上がる場合がある。) | |
dependent | 関連づけしているモデルでレコードの削除が行われた際に自動的に関連するレコードを削除するようにする。 | |
inverse_of | 自分のモデル名を指定する。polymophicオプションと同時には指定できない。 | |
polymorphic | 指定したモデルに従属するのではなく、任意の数のモデルに従属することができるようにする。関連づけるモデル名を任意の名称(タイプ)にすることで複数行のbelongs_toの設定が不要になる。 | |
touch | 関連づいているモデルが保存される度にタイムスタンプを更新する。 | |
validate | 関連づいているモデルが保存される度に必ず検証される。 | false |
詳細
dependent
追加されるメソッド
belongs_to関連づけをしたモデルは下記メソッドが追加される。
メソッド名 | 説明 |
---|---|
モデル名 | 関連づけしているモデルを返す。 |
モデル名=(モデル) | 引数のモデルを関連づける。 |
build_モデル名(カラム名:値,カラム名:値...) | レコードを生成する。テーブルには保存されない。 |
create_モデル名(カラム名:値,カラム名:値...) | レコードを生成する。カラムの検証をパスすればテーブルに保存される。 |
create_モデル名!(カラム名:値,カラム名:値...) | レコードを生成する。カラムの検証をパスしなければ例外が発生する。 |
この記事へのコメントはありません。