2012-07-17 1 views
1

나는이 협회와 계정라는 모델이 있습니다레일 : 액티브 오브젝트는 to_json로 인코딩 복원

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

파인 : 난 to_json을 가진 파일에 저장 어떤 계정 오브젝트를 파괴하기 전에

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

accepts_nested_attributes_for :contracts 
accepts_nested_attributes_for :packages 

을 . 내가 그것을 복원해야 할 때 문제는 (다른 스크립트에) 발생 : 이런 이유

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

:

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

이것은 예외가 발생? 레일즈가이 경우 해시를 받아 들여야하지 않습니까?

해시에서 계약 및 패키지 키를 제거하고 @ account.save를 삽입 한 후에 삽입해야합니까? 나는 이것을 처리하는 더 깨끗한 방법을 찾고있다.

답변

0

@account.to_json(:include => [:packages, :contracts])의 출력을 보라. 그것은 JSON으로 협회를 직렬화, 그래서 당신은 같은 끝낼 : 당신이 JSON을 다시로드 할 때이 이렇게하려고 후드,

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

:

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

이하지 않습니다 account.packages는 연관이므로 해시를 사용하여 직접 빌드 할 수 없기 때문에 작동합니다. 당신은, 그러나, 중첩 된 속성으로 해시를 전달할 수 있습니다

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

packages_attributes 이미 모델에있는 accepts_nested_attributes_for 클래스 메소드에 의해 정의 된 방법이다.

이것은 to_json과 잘 어울리지 않습니다. 그러나 ActiveRecord에는 to_json

까지 잘 재생되도록 설계된 from_json 메서드가 있습니다.