概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Nullalign gem - find missing presence validation on a database level
- 原文公開日:
- 著者: Paweł Dąbrowsk
Rails tips: Nullalign gemでデータベースのバリデーション漏れを検出(翻訳)
指定されたカラムの値が常に存在することを確認したい場合、presence
バリデータを使うのが普通です。以下は、User
モデルのtitle
カラムをバリデーションするシンプルな例です。
class Post < ActiveRecord::Base
validates :title, presence: true
end
残念ですが、これでは不十分です。タイトルが空欄のままのpost
が作成される可能性があるのです。ではどうやって回避すればよいのでしょうか。それには指定のカラムがnull
値を持てないようデータベースレベルで確認します。マイグレーションファイルでnull
属性を渡すことでこれを設定できます。
class CreatePosts < ActiveRecord::Migration
def change
create_table :posts do |t|
t.string :title, null: false
t.timestamps null: false
end
end
end
既存のアプリ
既存のアプリで作業していて、presence
バリデーションが設定されているものの、同じルールがデータベースレベルに設定されてないか所をすべて更新したい場合は、少しややこしくなります。コードベースが大規模になるとこの作業で相当時間を取られてしまいます。しかし実はそんなことをする必要はありません。
Tom Copeland作のnullalign gemを使えばよいのです。面倒な作業を肩代わりしてくれる、とても使いやすいツールです。さっそく使ってみましょう。
Gemfile
にこのgemを追加します。
gem 'nullalign'
後はbundle install
を実行すれば準備完了です。ルールはシンプルで、やるべきタスクは1つだけしかありません。bundle exec nullalign
を実行すると、以下のような感じで出力されます。
There are presence validators that aren't backed by non-null constraints.
--------------------------------------------------------------------------------
Model Table Columns
--------------------------------------------------------------------------------
Post posts: title
このリストを見て、更新したいカラムを見繕います。最後に、カラムを更新するマイグレーションを作成します。
class UpdatePosts < ActiveRecord::Migration
def change
change_column :posts, :title, :string, null: false
end
end
以上でおしまいです。nullalignリポジトリとTomのTwitterをチェックしてみてください。
お知らせ: RSpec & TDDの電子書籍を無料でダウンロード
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。