0

在我的模型中,我有:

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 文本。但刷新后一切正常。这很混乱,有什么问题吗?铁轨中的错误?

不是每次,有时在第一次访问时一切都很好。

4

1 回答 1

0

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

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

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

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

于 2012-07-02T07:12:31.890 回答