覆盖as_json的as_json(:includes =>:association)

时间:2011-10-06 15:11:54

标签: ruby-on-rails json serialization associations

我有两个班,Foo和Bar。 Foo has_many酒吧。 Bar实际上是共享STI表的几个类的超类。

我想转储我的Foo记录,包括它们相关的条形码。要做到这一点,我打电话

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

最初的问题是我希望能够区分不同类型的Bar类。 Rails通过Bar表中的type列进行区分,但该列不包含在Ber记录的json序列化中。

所以,我在Bar类中重写了to_json以包含type属性。当我在Bar的一个实例上调用to_json时,我得到了新的结果,但是当我在Foo上调用to_json并包含它的Bars时,我得到了旧的to_json(即没有包含type属性)。

我已经放弃了这个并采用不同的方法,但我仍然对这里发生的事情感到好奇。也许我应该使用as_json而不是to_json?我仍然不明白这两种方法之间的差异。

1 个答案:

答案 0 :(得分: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有所启发。