0

私は、JavaScript関数にJSONを提供するためのコントローラーアクションの1つにAJAX getリクエストを作成しています。この関数は、ビュー内のデータに基づいてsvgを生成します。

ただし、作業しているデータもビュー内のテーブル内に表示する必要があり、データベースに対してクエリを複数回実行する必要がないため、実行するだけで可能かどうか疑問に思いました。ページの最初のリクエストに対するクエリを実行し、paramsハッシュの下でAJAXを使用して他のコントローラーに渡しますか?

ここで質問を単純化するために、現在のワークフローの概要を示します。

ページリクエスト->クエリ->提供されたビュー->AJAXGETリクエスト->クエリ->SVGの生成

私が欲しいもの:

ページリクエスト->クエリ->提供されたビュー->AJAXGETリクエスト->SVGの生成

リレーションをAJAXリクエストのパラメーターとして渡すだけでよいと思いましたが、リレーションをActiveRecord :: Relationshipとして渡す代わりに、文字列として渡します。

"#<ActiveRecord::Relation:0x00000009137fc8>":String

また、セッションに保存してみました。例:

session[:foo] = @bar

しかし、次のエラーメッセージが表示され、セッションでリレーションを保存できないと思われますか?

デフォルトのprocでハッシュをダンプすることはできません

この種のワークフローに適したソリューションは何ですか?

4

2 に答える 2

1

これActiveRecord::Relationは内部のRailsオブジェクトであり、JavaScriptの「外の世界」が知っていることではありません。(理論的には、シリアル化してから逆シリアル化することもできます...しかし、それは悪い考えです:-)。いいえ、それは正しいアプローチではありません。オブジェクト自体(ActiveRecord :: Relationshipではなくクエリの結果)をセッションに保存できますが、これは一般的には適切な方法ではありません。

では、どうすればあなたが望むことを達成できますか?

まず、Railsはほとんどのデータベースクエリをキャッシュする傾向があるため、何かを最適化する前に、最適化が必要であることを確認してください。

そうだとすると、クエリの結果を表示することと、SVGを生成する別のリクエスト(AJAXリクエスト)を作成することの2つの別々のことをしているように見えます。これらの2つの完全に異なる方法(明らかに、いくつかの点で関連している)ではありませんが、形式が異なり、異なる時間に実行されます。これは、2つの異なる方法を示唆します。

それらが本当に近い場合、つまり、最初のビューに必要なものの90%がある場合は、最初のビューに非表示のフィールドまたは表示されていない値を追加することもできます。JSでは、AJAXクエリを起動します。 SVGを生成するために必要な値のページ(DOM)。

場合によってdata-は、HTMLの属性を使用して、JS経由で簡単にアクセスできるより構造化された形式で属性値を保持し、オブジェクト全体をHTMLの非表示データに効果的にシリアル化するのを見てきました。

ただし、これを行う前に、最適化が必要なものを最適化していることを確認してください:-)

于 2012-12-06T21:59:32.490 に答える
0

あなたはこれを行うことができます :

var Relation ='<%= @ criteria.where_values_hash.to_json.html_safe%>'

次に、このリレーション変数を「データ」のajaxリクエストで送信できます。

于 2013-12-15T14:09:19.163 に答える