11

我有一个表格,其中有一列是文本类型。里面有一个小字符串,应该序列化为数组

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 回答