【发布时间】:2011-01-30 21:10:13
【问题描述】:
我正在尝试在 Rails 中将 ActiveRecord 模型转换为 JSON,虽然 to_json 方法通常有效,但不包括模型的虚拟属性。 Rails 中有没有办法不仅列出模型的属性,还列出 attr_accessor 和 attr_reader 属性,以便在模型转换为 JSON 时所有可读属性都可用?
【问题讨论】:
标签: ruby-on-rails json activerecord
我正在尝试在 Rails 中将 ActiveRecord 模型转换为 JSON,虽然 to_json 方法通常有效,但不包括模型的虚拟属性。 Rails 中有没有办法不仅列出模型的属性,还列出 attr_accessor 和 attr_reader 属性,以便在模型转换为 JSON 时所有可读属性都可用?
【问题讨论】:
标签: ruby-on-rails json activerecord
我这样做是为了将信息放入模型中并保持该方法与其他类可能调用它的任何方式兼容(as_json 由 to_json 调用并且应该返回 Hash):
class MyModel < ActiveRecord::Base
def as_json options=nil
options ||= {}
options[:methods] = ((options[:methods] || []) + [:my, :virtual, :attrs])
super options
end
end
(在 Rails v3.0 中测试)
【讨论】:
在 Rails 3 之前,使用 :method 选项:
@model.to_json(:method => %w(some_virtual_attribute another_virtual_attribute))
在 Rails 3 中,使用 :methods 选项
@model.to_json(:methods => %w(some_virtual_attribute another_virtual_attribute))
【讨论】:
:only => [:attr1, :attr2] 过滤属性。有没有办法将:only 与:methods 参数结合起来?
to_json(only: [:key_a, :key_b], methods: [:method_name])
我不确定它是否在 Rails 3 中发生了变化,但现在你必须使用 :methods 选项而不是 :method
【讨论】:
其他答案参考methods 调用,它返回所有方法,包括那些不是属性的方法。另一种方法是使用attributes,它返回模型的属性,但不包括其虚拟属性。
如果这些是已知的,那么在模型中添加如下内容可能会有所帮助:
VIRTUAL_ATTRIBUTES = %i{foo bar baz}
VIRTUAL_ATTRIBUTES.each { |a| attr_accessor a } # create accessors
def attributes
VIRTUAL_ATTRIBUTES.each_with_object(super) { |a,h| h[a] = self.send(a) }
end
【讨论】: