【问题标题】:ActiveRecord store attribute in rails 4.2 breaking on serializationRails 4.2 中的 ActiveRecord 存储属性在序列化时中断
【发布时间】:2015-11-04 19:18:13
【问题描述】:

我正在将 Rails 3 项目升级到 Rails 4,但它正在破坏我使用 ActiveRecord Store 属性的模型之一。我的模型如下所示:

class ModelClass < ActiveRecord::Base
    attr_accessible :attr_1, ..., attr_n, as: :admin

    store :properties, accessors: [:attr_1, ..., :attr_n], coder: JSON
end

:properties 字段是 Postgres 中的文本字段。

当我尝试访问此模型中的数据时,我得到以下JSON::ParserError

795: unexpected token at '{"attr_1"=>"", ..., "attr_n"=>""}'

这些记录都是在 Rails 3 中创建的,在升级到 Rails 4 之前,我的模型类在 store 调用结束时没有 coder: JSON。看起来数据库中的数据没有正确序列化有没有人知道为什么以及如何修复它?是因为我的数据看起来像数据库中带有=&gt; 散列火箭的红宝石散列吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord store


    【解决方案1】:

    是的,JSON 解析器失败,因为字符串不是 json。

    您可以通过评估字符串并将其转换为 json 来修复您的记录。 eval 要小心使用,但如果这是一次性工作,那么您可能会在 rails console 中运行类似的内容。

    ModelClass.all.each do |m|
      m.properties = eval(m.properties).to_json
      m.save
    end
    

    未经测试,请先尝试一条记录,然后再更新整个表格。

    【讨论】:

    • 它还会以文本形式存储在数据库中吗?当我添加新记录时,它们现在会以正确的 json 格式存储吗?
    • 它将被存储为文本yes。如果您能够按照 mu 的建议在数据库级别使用 json 数据类型,那么它会更好(并且您不需要store 序列化但需要store_accessor 来读取数据)
    • 我猜这不会起作用,因为ModelClass 在加载每一行时会尝试将properties 解析为 JSON。我认为您需要完全绕过模型并使用直接数据库调用手动进行格式转换。
    • 感谢您的帮助!当我升级到 4.2 时,你们是否知道在 Rails 中执行此操作的好方法? (@muistooshort 你说得对,这不起作用)
    • 对不起,我走了。您不能暂时将属性指定为常规属性而不是模型中的商店,以便进行更新吗?
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多