1

我生成 JSON 如下:

def suggest_gems
  @allgems = RubyGem.where("name like ?", "%#{params[:q]}%")
  respond_to do |format|
  format.json { render :json => @allgems.to_json }
  end
end 

但是,RubyGem 表非常大,其中包含描述、链接和创建、更新的值。如何仅在生成的 JSON 中输出名称和 ID 以减少加载时间?谢谢。

4

3 回答 3

2

你可以真正清理你的控制器方法并实现你想要的这样:

def suggest_gems
  @allgems = RubyGem.where("name like ?", "%#{params[:q]}%")
  respond_with(@allgems, :only => [:id, :name])
end 

如果你在控制器的顶部有这个:

respond_to :json

编辑

如果您不想使用respond_to,请执行以下操作:

def suggest_gems
  @allgems = RubyGem.where("name like ?", "%#{params[:q]}%")
  render :json => @allgems.as_json(:only => [:id, :name])
end 
于 2012-12-20T16:41:11.677 回答
1

您需要as_json在模型中覆盖以仅返回要发回的属性。

def as_json(options)
  super(only: [:id, :name])
end
于 2012-12-20T16:35:33.917 回答
0

所以我想出了如何在不改变as_json方法或使用respond_with语句的情况下通过添加几行代码来做到这一点。这是我所做的:

def suggest_gems (result = [])
   @allgems = RubyGem.where("name like ?", "%#{params[:q]}%")
   @allgems.each { |g|
     result << { :id => g.id, :name => g.name }
     } 
   respond_to do |format|
   format.json { render :json => result.to_json }
   end
end 

我基本上定义了一个数组并相应地关联了nameandid属性,然后将数组格式化为 JSON。加载时间缩短了大约 6 秒 :)

在此处添加此答案,以便其他人可能会发现它有帮助!

于 2012-12-20T17:08:31.637 回答