Ruby on rails 重写as_json的as_json(:includes=>;:association)

Ruby on rails 重写as_json的as_json(:includes=>;:association),ruby-on-rails,json,serialization,associations,Ruby On Rails,Json,Serialization,Associations,我有两门课,Foo和Bar。福有很多酒吧。Bar实际上是共享一个STI表的几个类的超类 我想转储我的Foo记录,包括它们相关的条。要做到这一点,我打电话 Foo.all.to_json(:incude => :bars) 最初的问题是,我希望能够区分不同种类的Bar类。Rails通过Bar表中的type列实现了这一区别,但该列不包括在Ber记录的json序列化中 因此,我在Bar类中重写了_json以包含type属性。当我在Bar实例上调用_json时,我会得到新的结果,但当我在Foo上

我有两门课,Foo和Bar。福有很多酒吧。Bar实际上是共享一个STI表的几个类的超类

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

Foo.all.to_json(:incude => :bars)
最初的问题是,我希望能够区分不同种类的Bar类。Rails通过Bar表中的type列实现了这一区别,但该列不包括在Ber记录的json序列化中

因此,我在Bar类中重写了_json以包含type属性。当我在Bar实例上调用_json时,我会得到新的结果,但当我在Foo上调用_json并包含其Bar时,我会得到旧的to_json(即不包含type属性)


从那以后,我已经放弃了这一点,并将采用不同的方法,但我仍然对这里发生的事情感到好奇。也许我应该使用as_json而不是to_json?我仍然不明白这两种方法之间的区别。

我无法复制这一点。它在我的测试类中运行正常

让我们调用类#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

这可能会对调用层次结构以及您的实例变量是否从正确的类获取json有所帮助。

我重写了我的问题。我想我把你弄糊涂了。Bar不是Foo的子类。它是一个关联的类,在Rails3中重写as_json是正确的方法。如果没有正确调用as_json,请参阅以下错误报告: