【问题标题】:overriding as_json for as_json(:includes => :association)为 as_json(:includes => :association) 覆盖 as_json
【发布时间】:2011-12-02 08:23:41
【问题描述】:

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

我想转储我的 Foo 记录,包括它们相关的 Bars。为此,我调用了

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?我还是不明白这两种方法的区别。

【问题讨论】:

    标签: ruby-on-rails json serialization associations


    【解决方案1】:

    我无法复制这个。它在我的测试类中表现正常。

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

    【讨论】:

    • 我重写了我的问题。我想我把你弄糊涂了。 Bar 不是 Foo 的子类。这是一个关联的类。
    • 在 Rails 3 中覆盖 as_json 是正确的方法。如果没有正确调用 as_json,请参阅此错误报告:github.com/rails/rails/issues/576
    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2015-10-14
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多