2010-12-08 1 views
0

は、私は、次のコントローラのコードがあります。ルビー - JSONフォーマット

def calculate_quote 

    @mouldings = Moulding.find(params[:id].split(","), :select => 'id, cost, width') 
    @mouldings.collect! do |moulding| 
    { "moulding_id_#{moulding.id}" => { :cost => moulding.cost, :width => moulding.width } } 
    end 
    @material_costs = MaterialCost.all 
    @material_costs.collect! do |material_cost| 
    { material_cost.material.gsub(" ", "_").downcase => { :cost => material_cost.cost_per_square_mm } } 
    end 
    @app_options = AppOption.all 
    @app_options.collect! do |app_option| 
    { app_option.name.gsub(" ", "_").downcase => { :value => app_option.value } } 
    end 

    respond_to do |format| 
    format.json { render :json => { :mouldings => @mouldings, :material_costs => @material_costs, :app_options => @app_options } } 
    end 
end 

そして、これは私に次のようなJSON出力を与える:

{"mouldings":[{"moulding_id_2":{"cost":"3.1","width":45}},{"moulding_id_4":{"cost":"1.5","width":30}},{"moulding_id_6":{"cost":"2.1","width":50}}],"material_costs":[{"mountboard":{"cost":"0.00000246494303242769"}},{"glass":{"cost":"0.0000032426589803639"}},{"backing_board":{"cost":"0.00000135110790848496"}}],"app_options":[{"vat":{"value":"17.5"}},{"wastage":{"value":"20"}},{"markup":{"value":"3"}}]} 

を、私は私が使用できるようにJSON出力をフォーマットしたいですどのように私は達成するために、コントローラを変更します

data.mouldings.moulding_id_2.cost 

:jQueryの構文の次の並べ替えを使用してデータを抽出しますこの?

答えて

1

データを構築する方法を再考してみましょう。私の意見では、オブジェクト索引としてIDを使用するのは大変意味がありません。代わりに、なぜこのような何かをしない:

@mouldings = Moulding.find(params[:id].split(","), :select => 'id, cost, width') 
@mouldings.collect! do |moulding| 
    { :id => moulding.id, :cost => moulding.cost, :width => moulding.width } 
end 

この方法では、あなたはその成形に必要なすべてのデータを含むオブジェクトの配列を持っている必要があります。 jQueryのでは、あなたはその後、この配列を反復し、あなたが必要なすべての情報をつかむことができ、このように:

data.mouldings:

$.each(data.mouldings, function(index, moulding) { 
    alert("This moulding has an id of " + moulding.id + " and costs " + moulding.cost); 
}); 

私はこれを明示的に呼び出すより多くの理にかなっていると思います。 moulding_id_2 .cost

あなたは、正確なmoulding_id#2を検索したい場合は、あなたは、私が上記示したようデータセットを反復処理し、そしてこのようなチェックを実行する必要があります。で

if (moulding.id == 2) {//do something}; 
+0

JSONフィード内のすべてのデータを使用して、クライアントで計算を実行します。確かに、データを複数ループするのではなく、 'data.mouldings.moulding_id_2.cost'や' data.material_costs.mountboard.cost'のようなものを使ってデータを取得する方が簡単ではありませんか? – freshest

+0

@freshestはい、確かに高速ですが、あなたのJavaScriptにIDをハードコードすることも意味します。あなたのデータが変わったなら、あなたはループに喜んでいます。同時に、アレイに3つまたは4つのモールディングがあるだけであれば、1998年以降に構築されたすべてのコンピュータの速度の違いは全く目立たないでしょう。あなたのデータが変更されず、パフォーマンスが実際に問題になることが分かっているならば、自然に、あなたのやり方がうまく機能します。 – treeface

0

モーメント、モールディングはシングルトンハッシュのリストです。詳細なハッシュへの単一のハッシュマッピングidにする必要があります。