one

activerecord(rails)の「type」カラムについて

RailsのModelに「type」という名前のカラムを追加するとNG!「type」は予約語になってるって!

※inheritance_columnというカラムに指定される。

だから、フォームからパラメータを引き受けてインスタンを作っても、値が格納されない。

@entry = Entry.new params[:entry] # params[:entry][:type] => 1
p entry.type # =>nil

となるわけだけど、処理内容を説明すると

  1. newメソッドで、initializeメソッドが実行される。
  2. initializeで、指定したハッシュをattributesに格納する。※ここでは {:type => 1, ...}
  3. attributes処理で、inheritance_columnに「type」カラムが登録されているので、処理から外される。
  4. 以下のメソッドを参照
...ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/base.rb
remove_attributes_protected_from_mass_assignment
attributes_protected_by_default
inheritance_column
単一テーブル継承に使用されるカラム名を定義します ― サブクラスで上書きできます。

activerecordで単一テーブルの予約語として使用しているから、そのまま継承すると「type」が予約語
なってしまうので

class Entry < ActiveRecord::Base
  self.inheritance_column = "type_class"
end

とかで、変更してみる。(良かろうか?)やっぱり、他の名前「entry_type」とかでカラムを作成しよう。