『徹底攻略Rails4技術者認定シルバー試験問題集』第2章「Active Record」の勉強メモです。随時更新します。
第2章 Active Record
問1
- モデルのテストデータは、フィクスチャファイルに YAML 形式で記述する
問2
- rails generate model コマンドのフィールド定義部分で decimal 型が指定できる
- 「decimal{5,2}」は、全体桁数5桁、うち小数点以下桁数2桁である数値を表す
- 同じくフィールド定義部分で、データ型の後ろに「:uniq」を指定すると、そのフィールドに一意性制約が設定される
問3
- PosgreSQL のネットワークアドレス型(inet、cidr、macaddr)に対応している
- inet、cidr は IPAddr クラス、macaddr は String クラスで表現される
問4
- コールバックの呼び出し順は下記の通り
- 作成時:before_validation → after_validation → before_save → around_save → before_create → around_create → after_create → after_save
- 更新時:before_validation → after_validation → before_save → around_save → before_update → around_update → after_update → after_save
- 削除時:before_destroy → around_destroy → after_destroy
問5
- rake db:seed コマンドで初期データが投入できるが、既存データは削除されない
- 既存データを削除したい場合は rake db:setup する
問6
- モデルの composed_of メソッドで、モデルの属性とバリューオブジェクトの関連を指定できる
- mapping オプションで対応関係を、class_name オプションでバリューオブジェクトのクラス名を指定できる
問9
- モデルの has_many メソッドの through オプションで、多対多の関連が指定できる
- 中間部分のモデル名は任意に指定できる
- 中間部分のモデルには任意の属性を追加できる
問10
- モデルの has_and_belongs_to_many メソッドで、多対多の関連が指定できる
- 結合テーブル名は2つのモデルの複数形の名称をアルファベット順に「_」でつないだもの(Group モデルと User モデルなら「groups_users」)
- 結合テーブルには2つのモデルの外部キー以外のカラムは持たせない
- 中間部分のモデルは作らない
問11
- rails generate コマンドで、データ型に references{polymorphic} を指定することで、ポリモーフィック関連の記述を含むモデルとマイグレーションを生成できる
- マイグレーションで「t.references :hogehoge, polymorphic: true」と記述するのは、「t.integer :hogehoge_id」と「t.string :hogehoge_type」を記述するのと同等
- 中間テーブルは作らない
問12
- モデルの save メソッドは、バリデーションエラーがあったら false を返す
- save! メソッドは、バリデーションエラーがあったら例外を発生させる
- モデルの valid? メソッドで、任意のタイミングでバリデーションできる
問13
- presence バリデーションヘルパーで、フォームの対応フィールドに値が入力されていることを検証できる
- absence バリデーションヘルパーで、フォームの対応フィールドに値が入力されていないことを検証できる
問14
- exclusion バリデーションヘルパーで、フォームの対応フィールドに入力された値がリストに含まれないことを検証できる
- リストは「validates :foo, exclusion: { in: ['bar', 'baz'] }」、「validates :foo, exclusion: ['bar', 'baz']」のように指定する
問15
- acceptance バリデーションヘルパーで、フォームの対応チェックボックスがチェックされていることを検証できる
- confirmation バリデーションヘルパーで、フォームの対応する2つのフィールドに同一の内容が入力されていることを検証できる
- 再入力用のフィールド名は、元のフィールド名に「_confirmation」を付けたもの
- 再入力用のフィールドは、デフォルトで必須とはならない(必須にしたければ presence ヘルパーを使う)