在模型数组上激活记录to_json \ as_json

时间:2010-10-22 14:54:29

标签: ruby activerecord sinatra activesupport

首先,我没有使用Rails。我正在使用Sinatra进行Active Record的这个项目。

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

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 }

2 个答案:

答案 0 :(得分:5)

尝试重写serializable_hash intead:

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

更多信息here

答案 1 :(得分:4)

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

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

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