【问题标题】:Rails 3 as_json :only or :methods option do not work with dynamic attributesRails 3 as_json :only 或 :methods 选项不适用于动态属性
【发布时间】:2011-11-30 02:23:17
【问题描述】:

在我的 Rails 3 控制器之一中,我需要返回 jSON 响应,模型上只有几个属性,所以我使用了

respond_with foo_list :only => [:id, :name], :methods => []

但仍然在响应中我看到的不仅仅是这两个属性,我注意到那些不需要的属性实际上是从查询选择函数生成的动态属性:

foo_list = Foo.select("count(bar) as dattr1, sum(adafsd) as dattr2")....

有没有办法解决这个问题?还是我必须自己构建哈希?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby json activerecord


    【解决方案1】:

    执行此操作的常规方法是在 ActiveRecord 上使用 #as_json 方法,该方法会自动将对象转换为其 json 表示形式。

    你可以用任何你想要的属性覆盖它:

    def as_json(options = {})
      # minimal
      if options[:minimal].present?
        {id: self.id, name: self.name }
      # default
      else
        super
      end
    end
    
    ...
    
    my_model = MyModel.find(...)
    my_model.as_json 
    my_model.as_json(:minimal)
    

    【讨论】:

    • 在 self.as_json 中调用 self.as_json 不会导致递归调用永无止境吗?我自己试过这个,我得到一个“堆栈级别太深”。
    • 你应该在 as_json() 中使用 super 而不是 self.as_json:result = super(options.reverse_merge(:except => :html_code))
    • 是的,我修好了,抱歉!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多