Ruby on rails 应包含在JSON序列化中的自定义模型方法

Ruby on rails 应包含在JSON序列化中的自定义模型方法,ruby-on-rails,ruby-on-rails-3,json,model,Ruby On Rails,Ruby On Rails 3,Json,Model,我正在使用javascript库构建组合框。 我需要构建一个带有全名的组合框,所以我指的是姓名+姓氏 因为在数据库中,这是两个独立的字段(在我的模型中也是如此),我想知道是否有一种快速的方法(而不是手动构建所有哈希对象)来“模拟”我的模型中存在一个额外的字段进行JSON转换,因为这个对象必须作为JSON数组返回,您可以在其中读取*full_name*作为键 感谢您的帮助您所能做的就是在用户类中使用setter方法,如下所示 def full_name=(string) names = str

我正在使用javascript库构建组合框。 我需要构建一个带有全名的组合框,所以我指的是姓名+姓氏

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


感谢您的帮助

您所能做的就是在用户类中使用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\u name
作为字段,即使它不是实际的列,Rails也会自动访问上面的方法并执行它,从而更新您实际需要的列。

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

特别是:方法散列:

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

您可以通过传递
:methods
选项并调用
super
来覆盖模型中的to_json方法。这将调用带有
:方法
选项的super类的
作为json版本,这样它将使用
全名
属性序列化您的模型

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

  def full_name
    "#{first_name} #{last_name}"
  end
end
如果您想知道更多可以传递给
as_json
方法的选项,请查看本文档。

回答得不错,伙计,例子也不错。给我一点时间测试一下,但我认为它会很好地工作您的回答是正确的,但我忘了提一件事,如果我想从json转换中省略一些字段以避免使用,该怎么办?您可以在
中添加:except选项作为\u json
。你检查了我答案中的链接了吗?没有,抱歉,在回答时,我正在处理代码的javascript部分,关键时刻:(.我现在正在看,再次感谢。我无法合并2个答案,但您的答案也很有用。Chamnap更适合我的情况,但您的答案有助于在json转换中包含“临时”方法的情况(因为它们是作为选项而不是重写传递的)抱歉,这不是我的意思,我需要的是相反的:读取全名并将其写入JSON对象,而不是将我的JSON对象转换为rails模型对象。
render :json => @person