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 

私は基本的に配列を定義し、それに応じてnameid属性を関連付けてから、配列を JSON としてフォーマットしました。読み込み時間が約 6 秒短縮されました :)

この回答をここに追加して、他の人が役立つと思うようにしてください!

于 2012-12-20T17:08:31.637 に答える