ゼットコードログ

コード的な何かを書いていきます。

activerecordのモデルからカラムの設定情報を取得する

.columns というメソッドを実行するとカラムごとの定義情報が配列に入って返ってくる。

{モデルクラス名}.columns
[#<ActiveRecord::ConnectionAdapters::MySQL::Column:0x00007fcb1e348758
  @collation=nil,
  @comment=nil,
  @default=nil,
  @default_function=nil,
  @name="{カラム名}",
  @null=false,
  @sql_type_metadata=#<ActiveRecord::ConnectionAdapters::SqlTypeMetadata:0x00007fcb1e348870 @limit=8, @precision=nil, @scale=nil, @sql_type="bigint(20)", @type=:integer>,
  @table_name="{テーブル名}">,
 #<ActiveRecord::ConnectionAdapters::MySQL::Column:0x00007fcb1e348168
  @collation=nil,
  @comment="",
  @default=nil,
  @default_function=nil,
  @name="{カラム名}",
  @null=false,
  @sql_type_metadata=#<ActiveRecord::ConnectionAdapters::SqlTypeMetadata:0x00007fcb1e348410 @limit=8, @precision=nil, @scale=nil, @sql_type="bigint(20)", @type=:integer>,
  @table_name="#{テーブル名}">,

カラムの設定情報によって、表示する情報を動的に変えたいときなどに役に立つ。 自分はカラムのnull許可設定に応じてフォームの項目ごとに入力必須か任意かを出し分けるということがしたかった。 その場合は @null の部分を見るといい。

application_recordにこんな感じでメソッドを入れておくと、各modelごとにメソッドが使えるのでいい感じ。

  class << self
    def nullable_column?(name)
      column = columns.find { |c| c.name == name || c.name == "#{name}_id" }
      column.present? ? column.null.present? : true
    end
  end