Railsでheroku(postgreSQL)を使っていた時に出たエラー、ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError
について書きました。
日本語の情報があまりなかったので解決に割と時間がかかりました。。。
同じエラーが出た方の参考になれば嬉しいです。
【Rails heroku】ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError
- 【Rails heroku】ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError
- RailsやRubyを学びたい人へ
起こったこと
モデルの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 3.0.0 リファレンスマニュアル)
Enumerable#collect (Ruby 3.0.0 リファレンスマニュアル)
Array#filter (Ruby 3.0.0 リファレンスマニュアル)
対策
そのため、
- postgreSQLを利用する際は、モデルのserializeメソッドで、特定のカラムをArray型に変換する前提での実装をしない
ようにする必要があります。
補足
開発環境ではserializeメソッドが使えるので、tagsカラムをArray型に出来ます。
# text型のフィールドを、配列で扱えるようにする # postgreSQLはserialize使用不可 # もし使う場合、herokuデプロイ時(postgreSQL利用時)はコメントアウト必須 + 実装の見直し要 serialize :tags, Array
が、不必要に開発環境と本番環境で実装を変えることはあまりよくないです。
もっといい実装方法がないか検討しましょう。
RailsやRubyを学びたい人へ
RailsやRubyを学びたい人は、
RailsHack(レイルズハック)という、
最近できた新しいプログラミングスクール(今なら通常価格69,800円が、早期割で29,800円!)か、
Udemy で下記のコースを受講すると良いです★
✅1. フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座
✅2. 【はむ式】ハンズオンで学ぶRuby on Rails 6【Dockerにも触れられる】 <- おすすめ。ハムさんはReactやTypeScriptの教材も非常に丁寧。
✅3. はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう
また、
Udemy は定期的にセールをやっていますし(90%OFFとかもザラ)、
「30日間なら返金できる」ので、
満足できなかった時でも安心です。
【公式】RailsHack(レイルズハック)
【公式】Udemyで学んでみる