Rails:如何处理“属性应该是一个数组,但是一个字符串”错误?

时间:2012-04-23 00:08:07

标签: ruby-on-rails arrays string activerecord serialization

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

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 个答案:

答案 0 :(得分:5)

来自fine manual

  

<强>序列化 (attr_name, class_name = Object)
  [...]序列化是通过YAML完成的。

因此,该列应包含image_urls的YAMLized版本,但'["image1.jpg", "image2.jpg"]'不是YAML数组。如果你想要使用原始序列化数据,那么你应该使用像

这样的东西
["image1.jpg", "image2.jpg"].to_yaml
# ---------------------------^^^^^^^

生成字符串。

或者更好的是,完全停止使用serialize以支持单独的表格。

答案 1 :(得分:2)

在Rails 4中,它对我没有任何.to_yaml的作用,只是将其添加到强{#1}}

的强对数中

答案 2 :(得分:0)

您可以尝试这样:{:serialized_attribute_name =&gt; []}。并且不要忘记将其作为强参数添加到适当的控制器中。当我遇到同样的问题时,它会帮助我。

答案 3 :(得分:0)

为了有一个“序列化”的数组列,我发现这非常有帮助。将此添加到您希望作为数组的列的迁移中:

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

有了这个,您不需要“序列化”列。它将是一个数组。