目次
Rails では STI がフレームワークとしてサポートされています。 そのため type
というカラムがあった場合、 Rails が STI で使用する type
と競合して、思うようにデータを更新できないことがあります。
環境
- Rails 4.2.4
- Ruby 2.2.3
例外の内容
今回は次のような Exception が出ました。
undefined method `safe_constantize’ for 1:Fixnum
エラーが発生したのは次のコードです。
1 |
AbcModel.create(type: 1) |
解決策
解決策は 2通り あります。
方法1
まずひとつめは、 そもそも type
なんていうカラム名を作るな という立場で、 例えば category
などにカラム名を変更します。
方法2
もうひとつは、 create
を使わないというやり方です。 今更カラム名なんて変更していられないという場合の逃げ道です。
create
を次のように変更すれば 保存はできます。
1 2 3 |
abc = AbcModel.new abc.type = 1 abc.save |
しかしこれだけだと次のエラーが発生します。
ActiveRecord::SubclassNotFound
The single-table inheritance mechanism failed to locate the subclass: ‘1’. This error is raised because the column ‘type’ is reserved for storing the class in case of inheritance. Please rename this column if you didn’t intend it to be used for storing the inheritance class or overwrite AbcModel.inheritance_column to use another column for that information.
エラーの発生箇所は次の通りです。
1 2 3 |
AbcMail.all.each do |abc| # some procedure end |
each
でリレーションを展開する時に発生します。
これを防ぐために、エラーメッセージにも書かれている inheritance_column
を nil
にします。
1 2 3 |
class AbcModel < ActiveRecord::Base self.inheritance_column = nil end |
(これをやると、 create
も使えるようになるんじゃないかと思うんですが、 未検証です。)