【问题标题】:Custom model method that should be included in JSON serialization应包含在 JSON 序列化中的自定义模型方法
【发布时间】:2012-05-30 17:20:23
【问题描述】:

我正在使用一个 javascript 库来构建组合框。 我需要用一个人的全名构建一个组合框,所以我的意思是名字+姓氏。

因为在数据库中它们是 2 个单独的字段(在我的模型中也是如此),我想知道是否有一种快速的方法(而不是手动构建所有哈希对象)来“模拟”额外字段的存在我的 JSON 转换模型,因为该对象必须作为 JSON 数组返回,您可以在其中读取 *full_name* 作为键。

感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 json model


    【解决方案1】:

    您可以通过传递 :methods 选项并调用 super 来覆盖模型中的 to_json 方法。这将使用:methods 选项调用超类的as_json 版本,以便使用full_name 属性序列化您的模型。

    class Person < ActiveRecord::Base
      def as_json(options={})
        options[:methods] = [:full_name]
        super
      end
    
      def full_name
        "#{first_name} #{last_name}"
      end
    end
    

    在您的控制器中,您可以简单地

    render :json => @person
    

    如果您想了解更多可以传递给as_json 方法的选项,请查看此文档。 http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

    【讨论】:

    • 很好的回答伙伴,也很好的例子。给我一秒钟的时间来测试,但我认为会很好地工作。
    • 显然 ;) 你的回答是正确的,但我忘了提一件事,如果我想 省略 json 转换中的某些字段以避免带宽消耗怎么办?
    • 您可以在as_json 中添加:except 选项。你检查我答案中的链接了吗?
    • 不,抱歉,在回答时我正在处理代码的 javascript 部分,关键时间 :(。我现在正在看,再次感谢。
    【解决方案2】:

    这似乎是这个问题的重复:

    Rails 3 respond_to json, with custom attributes/methods

    特别是 :methods 哈希:

    respond_with({
      :cars => @cars.as_json(:only => [:make, :model], :methods => [:full_name]),
      :vans => @vans
    })
    

    【讨论】:

    • 我无法合并 2 个答案,但您的答案也很有用。 Chamnap 更适合我的情况,但您的回答对于您希望在 json 转换“临时”中包含方法的情况很有帮助(因为它们作为选项而不是覆盖传递)。
    【解决方案3】:

    你可以做的是像这样在你的 User 类中有一个 setter 方法

    def full_name=(string)
      names = string.split # the default delimiter is a space
      self.update_attributes(:first_name => names[0], :last_name => names[1])
    end
    

    然后表单应该引用:full_name 作为一个字段,即使它不是一个实际的列,Rails 也会自动访问上面的这个方法并执行它,从而更新你真正想要的列。

    【讨论】:

    • 对不起,这不是我的意思,我需要相反:读取全名并将其写入 JSON 对象,而不是将我的 json 对象转换为 rails 模型对象。
    猜你喜欢
    • 2014-10-05
    • 2013-10-27
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多