我有两个班,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?我仍然不明白这两种方法之间的差异。
答案 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有所启发。