2

これらの関連付けを持つ Account というモデルがあります。

has_many :contracts, :dependent => :destroy
has_many :packages, :dependent => :destroy

accepts_nested_attributes_for :contracts
accepts_nested_attributes_for :packages

Account オブジェクトを破棄する前に、to_json を使用してファイルに保存します。

@account.to_json(:include => [:packages, :contracts])

罰金。(別のスクリプトで)復元しようとすると問題が発生します:

account_data = JSON.parse json
@account = Account.new account_data

これにより例外が発生します。

Package(#70193553579560) expected, got Hash(#70193548333800)

なぜこれが起こるのですか?この場合、Rails はハッシュを受け入れるべきではありませんか?

@account.save を実行した後、コントラクトとパッケージ キーをハッシュから削除して挿入する必要がありますか? これを処理するためのよりクリーンな方法を探しています:)

4

1 に答える 1

0

の出力を見てください@account.to_json(:include => [:packages, :contracts])。関連付けを JSON としてシリアル化するため、最終的には次のようになります。

{"id":10, packages:[{id:5,description:"Package1"}], contracts:[]}

JSON をリロードしようとすると、フードの下でこれを実行しようとしています。

account.packages = [{id:5,description:"Package1"}]

account.packages は関連付けであり、ハッシュを使用して直接構築できないため、これは機能しません。ただし、ハッシュをネストされた属性として渡すことができます。

account.packages_attributes = [{id:5,description:"Package1"}]

packages_attributesaccepts_nested_attributes_forモデルにすでにあるクラスメソッドによって定義されたメソッドです。

これは とうまく動作しませんto_json。ただし、ActiveRecord には、適切from_jsonに再生するように設計されたメソッドもあります。to_json

于 2016-02-08T20:13:20.553 に答える