【问题标题】:Including a model's virtual attributes when converting a record to JSON in Rails在 Rails 中将记录转换为 JSON 时包括模型的虚拟属性
【发布时间】:2011-01-30 21:10:13
【问题描述】:

我正在尝试在 Rails 中将 ActiveRecord 模型转换为 JSON,虽然 to_json 方法通常有效,但不包括模型的虚拟属性。 Rails 中有没有办法不仅列出模型的属性,还列出 attr_accessor 和 attr_reader 属性,以便在模型转换为 JSON 时所有可读属性都可用?

【问题讨论】:

    标签: ruby-on-rails json activerecord


    【解决方案1】:

    我这样做是为了将信息放入模型中并保持该方法与其他类可能调用它的任何方式兼容(as_jsonto_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 中测试)

    【讨论】:

    • +1:效果很好,我喜欢在我的模型类中定义一次
    • 我也非常喜欢这个解决方案,非常优雅……确实!这个最好的部分是它可以毫不费力地融入 ActiveAdmin,控制器是抽象的和动态生成的,所以这肯定是最短的解决方案。
    【解决方案2】:

    在 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 =&gt; [:attr1, :attr2] 过滤属性。有没有办法将:only:methods 参数结合起来?
    • to_json(only: [:key_a, :key_b], methods: [:method_name])
    【解决方案3】:

    我不确定它是否在 Rails 3 中发生了变化,但现在你必须使用 :methods 选项而不是 :method

    【讨论】:

      【解决方案4】:

      其他答案参考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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多