【问题标题】:Active Record to_json\as_json on Array of Models模型数组上的活动记录 to_json\as_json
【发布时间】:2011-04-29 05:20:02
【问题描述】:

首先,我没有使用 Rails。我在这个项目中使用 Sinatra 和 Active Record。

我希望能够在我的 Model 类上覆盖 to_json 或 as_json 并让它定义一些“默认”选项。例如我有以下内容:

class Vendor < ActiveRecord::Base
  def to_json(options = {})
    if options.empty?
      super :only => [:id, :name]
    else
      super options
    end
  end
end

Vendor 的属性不仅仅是 id 和 name。在我的路线中,我有以下内容:

@vendors = Vendor.where({})
@vendors.to_json

这里@vendors 是一个数组供应商对象(显然)。然而,返回的 json 并没有调用我的 to_json 方法,而是返回了所有模型属性。

我实际上没有修改路线的选项,因为我实际上使用的是修改后的 sinatra-rest gem (http://github.com/mikeycgto/sinatra-rest)。

关于如何实现此功能的任何想法?我可以在我的 sinatra-rest gem 中执行以下操作,但这似乎很愚蠢:

@PLURAL.collect! { |obj| obj.to_json }

【问题讨论】:

    标签: ruby activerecord sinatra activesupport


    【解决方案1】:

    尝试覆盖 serializable_hash intead:

    def serializable_hash(options = nil)
      { :id => id, :name => name }
    end
    

    更多信息here

    【讨论】:

    • 正是我需要的。我喜欢这样一个事实,即我也可以添加不是属性的属性。非常感谢!
    【解决方案2】:

    如果您覆盖 as_json 而不是 to_json,则数组中的每个元素将在数组转换为 JSON 之前使用 as_json 格式化

    我使用以下内容仅公开可访问的属性:

    def as_json(options = {})
        options[:only] ||= self.class.accessible_attributes.to_a
        super(options)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      相关资源
      最近更新 更多