【问题标题】:Rails: How to handle "Attribute was supposed to be a Array, but was a String" error?Rails:如何处理“属性应该是一个数组,但是是一个字符串”错误?
【发布时间】:2012-05-03 15:17:23
【问题描述】:

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

serialize :image_urls, Array 

有时,SQL 插入数据的速度更快。 在这种情况下,我将插入作为字符串

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

由于我插入了一个字符串,我的 Rails 应用程序在尝试读取数据时崩溃,并显示以下错误消息:

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

有没有办法不抛出这个错误,或者捕获它并转换数据?

我的意思是将字符串转换为数组只是一个简单的调用,所以,这应该很容易。我只是不知道在哪里,或如何完成它。


我有点想覆盖 object_from_yaml,但我不确定在哪里做这项工作。
我在正确的轨道上吗?

【问题讨论】:

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


    【解决方案1】:

    来自fine manual:

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

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

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

    生成字符串。

    或者更好的是,完全停止使用serialize,转而使用单独的表格。

    【讨论】:

    • 数据太复杂而无法标准化。或者这将是一个正确的痛苦,因为我必须有几十个非常小的表(这个例子是一个字段,但是有很多表中的一些)
    • 有没有办法覆盖抛出错误的函数?
    • @dave:修复数据库中的数据:你破坏了它,你买了它。
    【解决方案2】:

    在 Rails 4 中,它为我工作,没有任何 .to_yaml,只是将它添加到强参数中作为 image_urls: []

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 你用 MySQL 或 PostgreSQL 测试过这个吗?
        猜你喜欢
        • 2017-02-14
        • 2013-05-14
        • 2018-04-29
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        相关资源
        最近更新 更多