Ruby数据结构呈现某种JSON格式

dt.*_*dt. 2 json ruby-on-rails

[
   {
      "id":"123",
      "name":"House"
   },
   {
      "id":"1456",
      "name":"Desperate Housewives"
   },
   {
      "id":"789",
      "name":"Dollhouse"
   },
   {
      "id":"10",
      "name":"Full House"
   }
]
Run Code Online (Sandbox Code Playgroud)

如何渲染从Ruby中生成这种JSON格式?我拥有来自DB(@result)的所有数据,并且不知道在Ruby中使用什么数据结构,当我这样做时将呈现给它:

respond_to do |format|    
    format.json { render :json => @result}
end
Run Code Online (Sandbox Code Playgroud)

@result应该是什么数据结构,我如何迭代生成它?谢谢!

Phi*_*oss 6

如果@result是ActiveRecord模型实例的数组,那么render :json => @result将生成类似于您所使用的内容,但将包含模型的所有属性(render调用to_json您传递它的对象,除非它是一个字符串).

要仅包含id和name属性,可以使用以下:only参数to_json:

respond_to do |format|    
  format.json { render :json => @result.to_json(:only => [:id, :name] }
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建仅包含所需属性的Hash对象数组:

respond_to do |format|    
  format.json { render :json => 
                  @result.collect {|o| {:id => o.id, :name => o.name} } }
end
Run Code Online (Sandbox Code Playgroud)

编辑:请参阅下面的@ dt评论.名为text的模型中有一个属性需要作为名称输出.这可以通过在模型中为文本创建别名来完成:

class Model < ActiveRecord::Base
  alias_method :name, :text
Run Code Online (Sandbox Code Playgroud)

并包括使用的名称:methods:

respond_to do |format|    
  format.json { render :json => @result.to_json(:only => :id, :methods => :name }
end
Run Code Online (Sandbox Code Playgroud)

或者,可以使用哈希方法数组重命名属性:

respond_to do |format|    
  format.json { render :json => 
                  @result.collect {|o| {:id => o.id, :name => o.text} } }
end
Run Code Online (Sandbox Code Playgroud)