11

テキストタイプの列が1つあるテーブルがあります。配列としてシリアル化する必要がある小さな文字列が含まれています

serialize :image_urls, Array 

SQLの方がデータの挿入が速い場合があります。この場合、文字列として挿入します

["image1.jpg", "image2.jpg"]

文字列を挿入しているため、データを読み取ろうとするとRailsアプリがクラッシュし、次のエラーメッセージが表示されます。

Attribute was supposed to be a Array, but was a String

このエラーがスローされないようにする方法、またはエラーをキャッチしてデータを変換する方法はありますか?

文字列を配列に変換するのは単純な呼び出しなので、これは簡単なはずです。どこで、どうやってそれを達成するのか、私にはわかりません。


object_from_yamlをオーバーライドすると思いますが、この作業をどこで行うかわかりません。
私は正しい方向に進んでいますか?

4

4 に答える 4

6

細かいマニュアルから:

serialize(attr_name, class_name = Object)
[...]シリアル化はYAMLを介して行われます。

したがって、列にはYAML化されたバージョンが含まれている必要がありますimage_urls'["image1.jpg", "image2.jpg"]'、YAML配列ではありません。生のシリアル化されたデータをいじくり回したい場合は、次のようなものを使用する必要があります

["image1.jpg", "image2.jpg"].to_yaml
# ---------------------------^^^^^^^

文字列を生成します。

serializeまたは、別のテーブルを使用するために、使用を完全に停止することをお勧めします。

于 2012-04-23T00:34:54.333 に答える
2

Rails 4では、それは何もなしで私のために働きました.to_yaml、ちょうどそれを強力なパラメータに追加しましたimage_urls: []

于 2014-06-30T10:13:22.463 に答える
0

次のように試すことができます:{:serialized_attribute_name=>[]}。そして、これを強力なパラメーターとして適切なコントローラーに追加することを忘れないでください。私が同じ問題に苦しんでいたときにそれは私を助けます。

于 2015-09-16T07:22:47.210 に答える
0

「シリアル化された」配列列を作成するには、これが非常に役立つことがわかりました。これを、配列として使用する列の移行に追加します。

add_column :table, :column_name, :text, array: true, default: '{}', using: "(string_to_array(column_name, ','))"

これにより、列を「シリアル化」する必要がなくなります。配列になります。

于 2021-02-05T17:23:29.093 に答える