RailsのMigrationでMySQLのカラムコメントを使う

加藤です。

MySQLの4.1以降ではテーブルの作成時やALTER TABLEでカラムを変更する際に、下のようにカラムコメントを付けることが出来ます。

CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL COMMENT '氏名: 日本語可。50文字以内。',
  `email` varchar(100) COMMENT 'メールアドレス: 半角英数文字のみ。100文字以内。',
  PRIMARY KEY  (`id`)
) 

また、付けたコメントは下のようなSQLで取得することが出来ます。

mysql> SHOW FULL COLUMNS FROM users;

このMySQLのカラムコメントをRailsのマイグレーションで簡単に設定できるようにすれば、ドキュメント生成なんかに使いまわせてDRYで便利じゃないかということでパッチを書きました。

module ActiveRecord
  module ConnectionAdapters
    class ColumnDefinition
      attr_accessor :comment
      def to_commented_sql
        self.comment ? "#{to_sql} COMMENT '#{self.comment}'" : to_sql
      end
      alias to_s :to_commented_sql
    end

    class TableDefinition
      alias :_orig_column :column
      def column(name, type, options = {})
        _orig_column(name, type, options)
        if comment = options[:comment]
          column = @columns.find { |col| col.name == name }
          pos = @columns.index(column)
          @columns[pos].comment = comment
        end
        self
      end
    end
  end
end

これをconfig/initializers/column_comment.rbあたりに置いておけば、マイグレーションでのテーブル作成時にカラムコメントを設定出来るようになります。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name, :null => false, :limit => 50, :comment => '氏名: 日本語可。50文字以内。'
      t.string :email, :limit => 100, :comment => 'メールアドレス: 半角英数文字のみ。100文字以内。'
    end
  end

  def self.down
    drop_table :users
  end
end
Bookmark and Share