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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

2185閲覧

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

yamady

総合スコア176

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2018/10/15 08:52

編集2018/10/15 12:20

お疲れ様です。

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

Ruby

1class AddDaysToSchedule < ActiveRecord::Migration[5.2] 2 def change 3 add_column :schedules, :days, :text, array: true 4 end 5end

schedule.rb

Ruby

1class Schedule < ApplicationRecord 2 serialize :days, Array 3・・・

試したこと

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

追記

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

migrationfile

Ruby

1class AddDaysToSchedule < ActiveRecord::Migration[5.2] 2 def change 3 add_column :schedules, :days, :string 4 end 5end

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]"]

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

投稿2018/10/15 11:15

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamady

2018/10/15 12:21

アドバイスいただきまして、誠にありがとうございます!なるほど、そうだったんですね。きちんと読まずに質問してしまい、申し訳ございませんでした。 ご指摘いただきました通り、string型で保存して、splitで配列化を試みましたが、取得したい結果を得ることができませんでした。やり方が根本的に間違っているのでしょうか? お手数おかけいたしますが、ご助言いただければ幸いです。
yamady

2018/10/15 12:57

add_column :schedules, :days, :string これをしたあとにserizlizeですね。 ありがとうございます。
akirafudo6

2018/10/16 07:02

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

2018/10/16 07:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問