2011-10-06 1 views
0

두 가지 Foo와 Bar 클래스가 있습니다. Foo has_many Bars. Bar는 실제로 STI 테이블을 공유하는 여러 클래스의 수퍼 클래스입니다.as_json에 대한 as_json (: includes => : association)을 대체합니다.

관련 바를 포함하여 내 Foo 레코드의 덤프를 만들고 싶습니다. 이를 위해

Foo.all.to_json(:incude => :bars) 

초기 문제는 다양한 종류의 Bar 클래스를 구별 할 수 있기를 바랍니다. Rails는 Bar 테이블의 type 열을 통해 이러한 구분을하지만 Ber 레코드의 json serialization에는이 열이 포함되지 않습니다.

그래서 bar 속성에서 to_json을 오버라이드하여 type 속성을 포함 시켰습니다. Bar의 인스턴스에서 to_json을 호출하면 새 결과가 표시되지만 Foo에서 to_json을 호출하고 Bars를 포함하면 이전 to_json (예 : type 특성이 포함되지 않음)이 표시됩니다.

나는이 문제를 포기하고 다른 접근법을 사용하려고하지만 나는 아직도 여기서 무슨 일이 일어나고 있는지 궁금해. 어쩌면 내가 to_json 대신에 as_json을 사용해야 할까? 나는 아직도이 두 가지 방법의 차이를 이해하지 못한다.

답변

0

복제 할 수 없습니다. 그것은 내 테스트 수업에서 제대로 작동합니다.

클래스 # 1을 호출합시다. Foo와 Foo가 Bar의 인수로 포함되어 있습니다. Bar.to_json (foo는),이를 추가

foo.class.ancestors.each do |c| 
    has_json = c.instance_methods.include?(:to_json) 
    p "#{c} has to_json: #{has_json}" 
    if has_json 
    p "Owner: #{c.instance_method(:to_json).owner}" 
    end 
end 

그것은 호출 계층 구조에 도움이 되거 오른쪽 클래스 또한 인스턴스 변수가 점점 여부를 to_json 수 있습니다.

+0

제 질문을 다시 작성했습니다. 너 혼란스러워. Bar는 Foo의 하위 클래스가 아닙니다. 그것은 관련된 클래스입니다. – CharlieMezak

+1

레일즈 3에서 as_json을 오버라이드하는 것이 적절한 방법입니다. as_json이 올바르게 호출되지 않으면 다음 버그 보고서를 참조하십시오. https://github.com/rails/rails/issues/576 – squarism

+0

ok thanks! 나는 계속 지킬거야. – CharlieMezak

관련 문제