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 すると、おかしなことが起こります。クラスは必要なときにのみロードされ、レールが変更された可能性があると判断したときにアンロードされるため、これは開発中に非常に簡単に発生する可能性があります。

クラスがロードされているかどうかに応じて、YAML ロードの結果は異なります (YAML はレールの自動ロード機能を認識していません)。

検討する価値のある解決策の 1 つは、activerecord オブジェクトではなく属性ハッシュを格納することです。おそらく長期的には問題を回避でき、長期的にはスペース効率が良くなります.activerecordオブジェクトには、おそらく気にしない状態がたくさんあります.

それができない場合は、シリアル化された列に含まれている可能性のあるクラスが読み込まれていることを確認するのが最善の策require_dependency 'foo'です。ファイルの先頭にいくつかの呼び出しがあります。

于 2012-07-02T07:12:31.890 に答える