スリ飯屋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 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でheroku(postgreSQL)を使っていた時に出たエラー、ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError について

でした。




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日間なら返金できる」ので、

満足できなかった時でも安心です。


f:id:mah666hhh:20201129193352p:plain


【公式】RailsHack(レイルズハック)

【公式】Udemyで学んでみる