Railsエンジンを作ってるとテーブル名や列情報を取得したいときがある。Railsアプリを作ってるときはあんまり無いけど。
そんなとき用に、ActiveRecord にはテーブルの情報を取得するためのクラスメソッドが用意されている。テーブル名なら table_name、列情報なら columns といった風にね。
irb(main):001:0> Task.table_name => "tasks" irb(main):002:0> Task.columns => [#<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c6f7b60 @name="id", @sql_type="INTEGER", @null=false, @limit=nil, @precision=nil, @scale=nil, @type=:integer, @default=nil, @primary=true, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c703b68 @name="user_id", @sql_type="integer", @null=false, @limit=nil, @precision=nil, @scale=nil, @type=:integer, @default=nil, @primary=false, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c703b18 @name="list_id", @sql_type="integer", @null=false, @limit=nil, @precision=nil, @scale=nil, @type=:integer, @default=nil, @primary=false, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c703ac8 @name="name", @sql_type="varchar(255)", @null=false, @limit=255, @precision=nil, @scale=nil, @type=:string, @default=nil, @primary=false, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c703a78 @name="deadline", @sql_type="datetime", @null=true, @limit=nil, @precision=nil, @scale=nil, @type=:datetime, @default=nil, @primary=false, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c703a28 @name="completed", @sql_type="boolean", @null=false, @limit=nil, @precision=nil, @scale=nil, @type=:boolean, @default=false, @primary=false, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c7039d8 @name="created_at", @sql_type="datetime", @null=false, @limit=nil, @precision=nil, @scale=nil, @type=:datetime, @default=nil, @primary=false, @coder=nil>, #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x007f8c1c703988 @name="updated_at", @sql_type="datetime", @null=false, @limit=nil, @precision=nil, @scale=nil, @type=:datetime, @default=nil, @primary=false, @coder=nil>] irb(main):003:0>
それにしても、列情報を取得するメソッドが columns なんていう単純な名前だったとはね…。schema や defined_attributes といった感じの難しい名前だと勝手に思い込んで調べてたよ。忘れないようにメモしておかなきゃ。