【问题标题】:Serialized column by model in rails work correctly only after refreshRails 中按模型序列化的列仅在刷新后才能正常工作
【发布时间】:2025-12-05 20:55:01
【问题描述】:

在我的模型中,我有:

class Log < ActiveRecord::Base
serialize :data

...

def self.recover(table_name, row_id)
    d = Log.where(table_name: table_name, row_id: row_id).where("log_type != #{symbol_to_constant(:delete)}").last
    row = d.data

    raise "Nothing to recover" if d.nil?
    raise "No data to recover" if d.data.nil?

    c = const_get(table_name)
    ret = c.create(row.attributes)

end

在我的控制器中,我将其称为:

def index
    Log.recover params[:t], params[:r]
    redirect_to request.referer
end

问题是,如果我第一次访问此页面,我会收到下面指定的错误,但刷新后一切正常。哪里有问题?

undefined method `attributes' for #<String:0x00000004326fc8>

在数据列中保存模型的实例。第一次列没有正确反序列化,它只是 yaml 文本。但刷新后一切正常。这很混乱,有什么问题吗?导轨中的错误?

不是每次,有时在第一次访问时一切正常。

【问题讨论】:

    标签: ruby-on-rails ruby serialization model refresh


    【解决方案1】:

    如果没有 Foo 类,对 Foo 类的对象进行 Deyamlize 会做一些有趣的事情。这在开发中很容易发生,因为类仅在需要时加载,而在 rails 认为它​​们可能已更改时卸载。

    根据类是否加载,YAML 加载会有不同的结果(YAML 不知道 rail 的自动加载内容)

    一个值得考虑的解决方案是存储属性散列而不是活动记录对象。从长远来看,您可能会避免问题,并且在长期错误时会更节省空间 - 在这种情况下您可能不关心的 activerecord 对象中有一堆状态。

    如果这不是一个选项,您最好的选择可能是确保已加载序列化列可能包含的类 - 仍然在文件顶部调用 require_dependency 'foo'

    【讨论】:

    • 你是对的,只保存 obj.attributes 就可以了!谢谢。
    最近更新 更多