2010-05-04 3 views
2

내 AR : B에 직렬화 가능하지 않은 특성이 있습니다.Ruby에 속성을 직렬화하지 않거나 marshal_dump를 제대로 오버로드하는 방법을 알려주는 방법은 무엇입니까?

o = Discussion.find(6) 
Marshal.dump(o) 

TypeError: no marshal_dump is defined for class Proc 
     from (irb):10:in `dump' 

나는 범인을 알고 내가 원하는 모든 직렬화가 발생하기 전에 전무 이 변수를 설정하는 것입니다.

나는이 작업을 수행 할 수 있지만 대체 할 적절한 방법과 붙어있어 marshal_dump

def marshal_dump 
    @problem = nil 
    # what is the right return here? 
end 

또는이 루비를 말하는 방법 또는 객체를 직렬화하지 AR입니까?

답변

2

marshal_dump은 serialize하려는 데이터가 들어있는 객체를 반환해야합니다. 이 개체는로드 할 때 marshal_load으로 다시 전달됩니다. 이 경우

, 나는 모든 AR (그리고 만) 속성에 당신이 덤프 할 데이터가 해당 있으리라 믿고있어, 그래서 시도를하려는 :

def marshal_dump 
    attributes 
end 

def marshal_load(data) 
    send :attributes=, data, false # false to override even protected attributes 
end 
+0

감사합니다 마크를. 올바른 코드는 instance_variable_set (: @ attributes, data)입니다. 그렇지 않으면 예외가 발생합니다. – GregMoreno

+0

@GregMoreno : 아니요, 저는 AR의 속성을 설정하는 유용한 방법 인'ActiveRecord :: Base # attributes ='를 호출하려고합니다. 'marshal_load'에 속성을 설정하고 싶다면 간단히'@some_attr = data [: some_attr]'를 쓸 수 있습니다. –

관련 문제