2011-10-06 51 views
0

我有兩個類,Foo和Bar。 Foo has_many酒吧。 Bar實際上是幾個共享STI表的類的超類。as_json覆蓋as_json(:includes =>:association)

我想轉儲我的Foo記錄,包括其關聯的酒吧。要做到這一點,我打電話

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

最初的問題是,我想能夠區分不同類型的酒吧類。 Rails通過Bar表中的類型列進行區分,但該列未包含在Ber記錄的json序列化中。

因此,我重寫Bar類中的to_json以包含type屬性。當我在Bar的一個實例上調用to_json時,我得到了新的結果,但是當我在Foo上調用to_json幷包含它的Bars時,我得到舊的to_json(即沒有包含type屬性)。

我已經放棄了這一點,並採用了不同的方法,但我仍然對這裏發生的事情感到好奇。也許我應該使用as_json而不是to_json?我仍然不明白這兩種方法之間的差異。

回答

0

我不能複製這個。它在我的測試課中表現得很好。

讓我們調用class#1將Foo和Foo作爲參數包含在Bar中。在Bar.to_json(富),補充一點:

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

重寫as_json是在Rails 3中完成的正確方法。如果as_json沒有正確調用,請參閱此錯誤報告:https://github.com/rails/rails/issues/576 – squarism

+0

好的謝謝!我會繼續努力的。 – CharlieMezak