スリ飯屋Malankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【Rails heroku】ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError

【Rails heroku】ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError

こんにちは、mahです。

このブログでは、自分がIT未経験から約1年でフリーランスエンジニアになるまでの過程、ノウハウなどを書いていきます。

今回は、 Railsでheroku(postgreSQL)を使っていた時に出たエラー、ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError について書きました。

日本語の情報があまりなかったので解決に割と時間がかかりました。。。

同じエラーが出た方の参考になれば嬉しいです。

f:id:mah666hhh:20200207084020p:plain

起こったこと

モデルのserializeメソッドで下記のように、tagsというText型のカラムを、Array型として扱う ようにしていました。

# Text型のフィールドを、配列で扱えるようにする
serialize :tags, Array

ですが、postgreSQL(herokuのデフォルトのDBはpostgreSQL) では、モデルのserializeメソッドが使えない ようです。

ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError (Column `tags` of type ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Array does not support `serialize` feature.
Usually it means that you are trying to use `serialize`
on a column that already implements serialization natively.
  • 参考リンク

ruby on rails - PostgreSQL::OID::Array does not support `serialize` feature - Stack Overflow

さらに、tagsカラムをArray型に出来ずText型のままであるため、

  • tagsカラムがArray型を期待しているメソッドでエラーになる

ということが起こっていました。

例えば、

  • each

  • collect

  • filter

などの、Array型のオブジェクトが呼び出せるメソッドを、Text型(というかString型)に入っているオブジェクトから呼ぶとエラーになります。

Array#each (Ruby 2.7.0 リファレンスマニュアル)

Enumerable#collect (Ruby 2.7.0 リファレンスマニュアル)

Array#filter (Ruby 2.7.0 リファレンスマニュアル)

対策

そのため、

  • postgreSQLを利用する際は、モデルのserializeメソッドで、特定のカラムをArray型に変換する前提での実装をしない

ようにする必要があります。

補足

開発環境ではserializeメソッドが使えるので、tagsカラムをArray型に出来ます。

# text型のフィールドを、配列で扱えるようにする
# postgreSQLはserialize使用不可
# もし使う場合、herokuデプロイ時(postgreSQL利用時)はコメントアウト必須 + 実装の見直し要
serialize :tags, Array

が、不必要に開発環境と本番環境で実装を変えることはあまりよくないです。

もっといい実装方法がないか検討しましょう。


以上、

  • Railsでheroku(postgreSQL)を使っていた時に出たエラー、ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError について

でした。

このブログでは、

僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、

ノウハウなどを書いています。




初めての方は下記のオススメ記事もどうぞ


www.malanka.tech


www.malanka.tech


www.malanka.tech


www.malanka.tech


www.malanka.tech




最後までお読み頂きありがとうございました★


もしよかったらTwiiterのフォローもお願いします★