RoR:过滤生成的JSON到某些参数

时间:2012-12-20 16:28:40

标签: ruby-on-rails ruby json

我正在生成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以减少加载时间? 感谢。

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

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

def as_json(options)
  super(only: [:id, :name])
end

答案 2 :(得分: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 

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

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