ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

「Ruby on Rails 3 アプリケーションプログラミング」 - 5章 モデル開発を読んで

Ruby on Rails 3 アプリケーションプログラミングを買い、5章「モデル開発」を読みました。

以下に、その時のメモと感想を挙げておきます。

◆クエリメソッド
その場ではDBにアクセスせず、必要になったときに初めてアクセスする。これを遅延ロードと呼ぶ。

◆プレイスホルダ
「?」でクエリパラメータを指定する。
これを使用することで、SQLインジェクション対策になる。(これだけでOKではないが。サニタイズとか・・・)

◆名前つきパラメータ
「:param」でクエリパラメータを指定する。
→実際の仕事だと、こっちをメインに使いそうだなあ。

◆selectメソッドによるデータ取得
データ取得時には、行や列をできるだけ絞り込むのが基本と考えるべき。
→本書以外の入門用サイトなどだと、全ての行や列をfindで抽出している例が多い気がする。

◆名前つきスコープ
よく使う検索条件を共通化するのに使う。
ラムダを使うことで、引数を渡せるようにすることも可能。

◆クエリメソッドと生のSQLの実行について
可能な限りクエリメソッドを使用すべきで、クエリメソッドで対処できないケースはほとんど無い。
が、find_by_sqlメソッドを使うことで、SQL文を直に記述することも可能。
→既存システムのリプレースとかで、SQLの中にロジックがゴチャゴチャ書いている時は?
社内システムのリプレイス方針とTips のように、上手くマッピングしたいけど・・・。

◆saveとsave!の違い
エラーが発生したときの戻り値が違う。saveはfalseを返し、save!はエラーを返す。
トランザクション処理ではエラーをcatchしてロールバックするため、save!を使用している。

◆楽観的同時実行制御について
対象データのテーブルには、予めlock_versionカラムを持っている必要がある。
migrate時に、初期値である0をセットする。
viewにlock_versionを隠し項目として保持しておき、登録時にテーブルの値と異なればエラーとする。

◆モデルの検証について
モデル内にvalidatesメソッドを使用して検証ロジックを記述する。
save, create, updateなど、データベースの更新時に自動的に検証ロジックは実行されるが
全てのメソッドで自動実行されるわけではないことに注意。

◆モデルのアソシエーション
・belongs_to、has_many、has_one
いわゆる「主」となるモデルを参照していることを表す。「従」となるモデルに記述する。
「主」となるモデルに、1:nの場合はhas_many、1:0〜1の場合はhas_oneを記述する。

・has_and_belongs_to_many
n:nの関連を表す。データベース上では中間テーブルを使うのが一般的。
中間テーブルは、主キー(id列など)、タイムスタンプ列(created_at,updated_at列など)を削除する必要がある。
関連がある双方のテーブルに、has_and_belongs_to_manyを記述する。

・has_many、throw
実在するモデルを挟んで、2つのモデルがn:nの関連になっている場合に使う。

・アソシエーションで追加される様々なメソッド
これらにより、関連があるモデルの参照だけでなく、追加・更新・削除なども可能。

ActiveRecordについての感想
アソシエーションを使用するためには、データベース設計を上手く行う必要があると思う。
よく見かける「汚い」関連を持ったデータベース設計だと、プログラムによるゴリ押しが必要になり
開発の効率化は難しいのではないか。

◆コールバック
ActiveRecordによるCRUD、検証が行われるのと同じタイミングで実行されるメソッド。

◆オブザーバ
モデルの操作と同じタイミングで実行されるべきだが、モデル内に記述すべきでない場合に使用。
例としては、bookモデルの登録時に、メールを送信する例が載せられている。

マイグレーション
マイグレーションを使用するメリットは、特定タイミングの状態にスキーマロールバックできること。
→うろ覚えでマイグレーションを使用し、時にはDBを直接弄っていたことを反省。

・主キーであるid列について
「特別な理由がない限り、できるだけこのルールを変更するべきではありません」(※1)

スキーマファイル
常に最新のスキーマ情報を保持しているファイル。

・データの初期化
「フィクスチャはテストデータの投入に、シードファイルはマスタテーブルなどの初期データを投入する」
のに利用する。

※1.「Ruby on Rails 3 アプリケーションプログラミング」P272
※2.「Ruby on Rails 3 アプリケーションプログラミング」P284