模型数组上的 Active Record to_json\as_json

发布于 2024-09-28 18:41:40 字数 774 浏览 5 评论 0原文

首先,我没有使用 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 }

First off, I am not using Rails. I am using Sinatra for this project with Active Record.

I want to be able to override either to_json or as_json on my Model class and have it define some 'default' options. For example I have the following:

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

where Vendor has more attributes than just id and name. In my route I have something like the following:

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

Here @vendors is an Array vendor objects (obviously). The returned json is, however, not invoking my to_json method and is returning all of the models attributes.

I don't really have the option of modifying the route because I am actually using a modified sinatra-rest gem (http://github.com/mikeycgto/sinatra-rest).

Any ideas on how to achieve this functionality? I could do something like the following in my sinatra-rest gem but this seems silly:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梨涡 2024-10-05 18:41:40

尝试重写serialized_hash:

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

更多信息此处

Try overriding serializable_hash intead:

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

More information here.

花伊自在美 2024-10-05 18:41:40

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

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

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

If you override as_json instead of to_json, each element in the array will format with as_json before the array is converted to JSON

I'm using the following to only expose only accessible attributes:

def as_json(options = {})
    options[:only] ||= self.class.accessible_attributes.to_a
    super(options)
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文