Rails tips: Nullalign gemでデータベースのバリデーション漏れを検出(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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』をどうぞお役立てください。

関連記事

Rails tips: カスタムバリデータクラスを作る(翻訳)

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ