Rails: undefined_method safe_constantize for Fixnum


Rails では STI がフレームワークとしてサポートされています。 そのため type というカラムがあった場合、 Rails が STI で使用する type と競合して、思うようにデータを更新できないことがあります。

環境

  • Rails 4.2.4
  • Ruby 2.2.3

例外の内容

今回は次のような Exception が出ました。

undefined method `safe_constantize’ for 1:Fixnum

エラーが発生したのは次のコードです。

解決策

解決策は 2通り あります。

方法1

まずひとつめは、 そもそも type なんていうカラム名を作るな という立場で、 例えば category などにカラム名を変更します。

方法2

もうひとつは、 create を使わないというやり方です。 今更カラム名なんて変更していられないという場合の逃げ道です。

create を次のように変更すれば 保存はできます。

しかしこれだけだと次のエラーが発生します。

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.

エラーの発生箇所は次の通りです。

each でリレーションを展開する時に発生します。

これを防ぐために、エラーメッセージにも書かれている inheritance_columnnil にします。

(これをやると、 create も使えるようになるんじゃないかと思うんですが、 未検証です。)