質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

Postgresqlで配列保存(出力)に失敗する(rails)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 933

yamady

score 177

お疲れ様です。

Ruby on RailsでarrayをHeroku本番環境に入れようとしたのですが
下記のエラーで失敗してしまいます。

ActiveRecord::AttributeMethods::Serialization::ColumnNotSerializableError (Column `days` 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.

ソースコード

migrationfile

class AddDaysToSchedule < ActiveRecord::Migration[5.2]
  def change
    add_column :schedules, :days, :text, array: true
  end
end

schedule.rb

class Schedule < ApplicationRecord
  serialize :days, Array
・・・

 試したこと

Postgresqlでは、どうやらserializeを使ってはいけないということは分かって
schdule.rbを下記のserializeを外してみると実際にビルド自体は成功したのですが
出力する際に、arrayと認識してくれずstringとなってしまうため出力でエラーとなってしまいます。

 追記

String型に保存して、その後配列に出力することを試みました。

migrationfile

class AddDaysToSchedule < ActiveRecord::Migration[5.2]
  def change
    add_column :schedules, :days, :string
  end
end

daysを出力するコード

[28] pry(#<EventType>)> self.days
=> "[0, 1, 2, 3, 4, 5, 6]"
[29] pry(#<EventType>)> self.days.split('')
=> ["[",
 "0",
 ",",
 " ",
 "1",
 ",",
 " ",
 "2",
 ",",
 " ",
 "3",
 ",",
 " ",
 "4",
 ",",
 " ",
 "5",
 ",",
 " ",
 "6",
[30] pry(#<EventType>)> self.days.split
=> ["[0,", "1,", "2,", "3,", "4,", "5,", "6]"]


このやり方は取得したいデータではないのですが、
文字列で保存して、配列をシリアライズ化する最適な方法はどんなやり方がございますでしょうか。

すみませんが、どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

いや、siriarizeを使ってはダメでなくて、そもそも、配列はpostgresではサポートされてないと言っている。(基本的にRDBは正規化して作る->即ち、繰り返し項目は無くなるはずなので、postgresにおいて配列(繰り返し項目はサポート外)string型に対して、配列をシリアライズ(文字列)に変換して試してみてと、書いてると思いますけど!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/15 21:21

    アドバイスいただきまして、誠にありがとうございます!なるほど、そうだったんですね。きちんと読まずに質問してしまい、申し訳ございませんでした。

    ご指摘いただきました通り、string型で保存して、splitで配列化を試みましたが、取得したい結果を得ることができませんでした。やり方が根本的に間違っているのでしょうか?
    お手数おかけいたしますが、ご助言いただければ幸いです。

    キャンセル

  • 2018/10/15 21:57

    add_column :schedules, :days, :string

    これをしたあとにserizlizeですね。
    ありがとうございます。

    キャンセル

  • 2018/10/16 16:02

    rubyは、解らないのですが、言語によって、シリアライズ化(オブジェクトを文字列に変換する)、デシリアライズ化(シリアライズしたものを基に戻す)というクラスがあると思います。また、postgresには、文字列を不定長で格納できるtextという属性があると思います。また、文字列変換には、base64とかいうのもあります。これは、写真とかイメージを文字列に変換するときに利用すると便利です。

    キャンセル

  • 2018/10/16 16:38

    ありがとうございます!base64便利そうですね、使ってみたいと思います!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る