バックアップを作成するために、一連のオブジェクトをファイルにシリアル化することを目指しています。モデルのメソッドを使用して、その作業を開始しました (ここでは、2 つの ActiveRecords foo と bar があると仮定して簡略化します)。
def backup(file, foo, bar)
file.write(foo.to_json(root: true))
file.write(bar.to_json(root: true))
end
これにより、必要に応じてファイルが得られます。この場合、2 つのレコードがあります。
{"foo":{"Account_id":1,"Name":"F","created_at":"2013-04-16T10:06:19Z","id":1,"updated_at":"2013-04-20T11:36:23Z"}}
{"bar":{"Account_id":1,"Name":"B","created_at":"2013-04-16T10:06:19Z","id":1,"updated_at":"2013-04-20T11:36:23Z"}}
後日、そのバックアップを読み込んでそれらのオブジェクトを再インスタンス化し、おそらくそれらをデータベースに永続化したいと考えています。私の目的は、ファイルを反復処理して各オブジェクトのタイプをチェックし、適切なオブジェクトをインスタンス化することです。
私はロジックの一部を持っていますが、まだすべてではありません。インスタンス化する前に、シリアル化された各オブジェクトのタイプを決定する方法を理解していません。復元用のコードは次のとおりです。
def restore(file)
file.each_line do |line|
**<some magic that parses my line into objectType and objectHash>**
case objectType
when :foo
Foo.new.from_json(objectHash)
Foo.process
Foo.save!
when :bar
Bar.new.from_json(objectHash)
Bar.process
Bar.save!
end
end
end
私が探しているのは、「いくつかの魔法」セクションに入るビットです。行を直接解析して foo か bar かを判断するコードを書くことはできますが、Rails/Ruby でこれを自動的に行うためのトリッキーな方法がおそらくあると思います。残念ながら、この場合、Google は私の味方ではありません。私が見ることができるのは、Web 要求で json に焦点を当てているページだけですが、この方法で json を解析していません。不足しているものはありますか、または文字列を直接分割してオブジェクト型を読み取るコードを書く必要がありますか?
文字列を直接分割するコードを書くとしたら、次のように書きます。
objectType = line[/^{"(\w*)"=>(.*)}/, 1]
objectHash = line[/{"(\w*)"=>(.*)}/, 2]
これはかなり醜く、もっと良い方法があると確信しています(私はまだ調査中です)が、これが正しいアプローチであるかどうかはわかりません.json表現を自動的に見て、インスタンス化するオブジェクトのルート値。
最後に、from_json を使用した実際のインスタンス化も機能していません。ActiveRecord のどのフィールドにもデータが入力されていません。nil パラメーターが返されるので、解析構文が正しくないと思います。
したがって、次の 3 つの質問があります。
- どのオブジェクトが欠けているのかを判断する方法はありますか?
- 存在せず、正規表現を使用する必要がある場合、同じ正規表現を持つ2行ではなく、行の両方のビットを一度に解析する構文はありますか?
- from_json 構文は不満に見えます。ここに欠けている構文はありますか? (もはや質問ではありません-上記のコードは修正されました。to_jsonであるべきときにas_jsonを使用していましたが、ドキュメントはそれについてかなり不明確です....)
(注:私の質問を明確にするために時間をかけて編集します。また、機能する正規表現を取得したため(以前は機能しませんでした)、それでも非常にエレガントかどうかはわかりません。)
詳細情報-ここでさらに掘り下げた問題の1つは、as_jsonが実際にjsonを提供していないことです-ファイルにあるのはハッシュであり、jsonではありません。さらに、ハッシュ内の created_at と lastupdated_at の値は引用符で囲まれていないため、基本的にはそれが途中で解析が失敗する原因となっています。as_json の代わりに to_json を使用する必要があることがわかりましたが、ドキュメントでは as_json が機能するはずです。