Rails4でエンタープライズなActiveRecordモデルを作るための6のステップ
1. 階層を分けてモデルを作る
まずはrails g
コマンドでモデルを作ります。たいていの場合はお互いに関連のある複数のモデルを作ることになりますが、それらモデルは同じ階層の下に置くようにします。
例えば
$ rails g model Blog::User name:string profile:text
$ rails g model Blog::Post user:references permalink:string title:string content:text
というようにモデルを作成します。
2. データベース制約を追加する
Railsが生成するmigrationにはデータベース制約が設定されていないので、そのままではエンタープライズ用途には使えません。
基本的にNOT NULL制約とUNIQUE制約は必ず設定しますし、外部キーがあればForeignerを使って外部キー制約も必ず設定します。
3. モデルにvalidationを追加する
生成されたモデルにはvalidationが設定されていないので追加します。
4. FactoryGirlを定義する
FactoryGirlを導入しているとFactoryGirl用のファイルも生成してくれますが、こちらもそのままでは不十分なのでNOT NULL制約とUNIQUE制約への対応を行います。
5. モデルテスト用のマッチャを追加する
続いてモデルのテストを行いますが、その前に必要なマッチャを追加します。
まずはshoulda-matchersを追加しますが、これだけでは不十分なのでいくつかカスタムマッチャを追加します。
今回使うカスタムマッチャはRails4のモデル用カスタムマッチャの以下のカスタムマッチャを追加します。
- have_not_null_constraint_onマッチャ
- データベースのNOT NULL制約をテストします
- have_unique_constraint_onマッチャ
- データベースのUNIQUE制約をテストします
- have_foreign_key_constraint_onマッチャ
- データベースの外部キー制約をテストします
- create_modelマッチャ
- FactoryGirlでのモデル生成をテストします
- safely_validate_uniqueness_ofマッチャ
- InvalidForeignKeyエラーにならないようにuniqueness validationをテストします
6. モデルテストを追加する
カスタムマッチャも追加して準備が整ったのでモデルのテストを追加します。
テストするのは大きく分けてFactoryGirl、Association、Validation、データベース制約の4種類になります。
Blog::User
モデルについても一通りちゃんと設定してテストを実行すると
$ rspec spec/models/blog/post_spec.rb
Blog::Post
with associations
should belong to user
with validations
should ensure permalink has a length of at most 64
should require content to be set
should ensure title has a length of at most 128
should require title to be set
should require permalink to be set
should require unique value for permalink
should require user_id to be set
with DB
should have NOT NULL constraint on content
should have UNIQUE constraint on permalink
should have NOT NULL constraint on permalink
should have NOT NULL constraint on title
should have FOREIGN KEY constraint on user_id
should have NOT NULL constraint on user_id
with FactoryGirl
should create 2 records
should create 1 record
Finished in 2.15 seconds (files took 12.15 seconds to load)
16 examples, 0 failures
となってうまくテストできていることが確認できます。
まとめ
Railsではひな形を自動的に作ってくれてとても便利なのですが、それだけで十分なモデルができるわけではないのでエンタープライズ用途での利用に最低限必要な修正をご紹介しました。
もっとこうした方がいいよ!ということなどありましたら@haracane宛に教えてくれるとありがたいです。