0

私は、1 年中毎日 1 日 3 回の入力を必要とするアプリケーションを作成しています。(3*365=1095)。各フィールドを効率的に出力する方法に苦労しています。

入力はオール オア ナッシングではありません (10 日分の入力を入力し、[保存] をクリックして、後で戻ってさらに入力することができます)。

コントローラーで 1095 個のオブジェクトすべてを構築し、ビューで入力を出力することでこれを実行しようとしましたが、明らかにこれは非常に遅く、おそらくメモリを大量に消費します。

助言がありますか?私はクライアント側でフォーム全体を作成し、AJAX を使用して既存の要素を埋めることに傾いています。

編集

このモデルは Timing と呼ばれ、これらの属性を持っています。 month, day, time1, time2, time3 したがって、365 個のモデルを保存する必要があります。

4

3 に答える 3

2

ネストされたリソースがあるようです。タイミングと呼ばれるリソースがあり、これには、何日と呼ばれるリソースが含まれていますか?

#routes
resources :timing do
  resources :day
end

したがって、タイミングが作成されると、365日もすべて作成されると仮定します(かなり高価な操作のように聞こえます)。フィールドの表示はそれほど難しいことではありません。あなたはただすることができます

#controller
def show
  @timings = Timing.all
end

#view
(Date.beginning_of_year..Date.end_of_year).each do |day|
  t = @timings.find { |timing| timing.date == day } #or some other method of deciding that the current day has a timing
  unless t.nil?
    form_for t #etc
  else
    form_for Timing.new #etc
  end
end

次に、UJSを介して送信するようにそれぞれを作成し、それを1日と呼ぶことができます。これはかなり複雑なデザインのように聞こえますが、問題のある領域が何であるかはわかりません。

于 2012-05-16T20:39:03.113 に答える
1

@DVGの答えはおそらく正常に機能しますが、すべての作業はサーバー上に保持されます。

私が最終的に考えたのは、最初の考えでした。次のような既存のタイミングをすべて取得します。

def edit
  @timings = Timing.find_by_store_id(params[:store_id])
end

次に、ビューで2つのjavascript関数を記述しました。1つは365行すべてを3列すべてで書き込みます。フィールドがすべてJavascriptで出力されたら、既存のレコードを取得してフォームに挿入する別の関数を使用しました。

<script type="text/javascript">
function updateForm(){
 timings = <%= @timings.to_json %>;
 ... fill out the fields ...
}
</script>

それは素晴らしく速く動作し、そして何よりも、AJAX呼び出しはありません。もちろん、1つの注意点は、ユーザーがJavascriptを無効にしている場合、これは失敗するということですが、それは私にとっては問題ではありません。

于 2012-05-22T01:04:36.217 に答える
1

私があなたの質問を正しく理解していれば、フォームに 1 日 3 回の時間入力を動的に表示する方法が必要です。

上記が正しい場合、@DVG が詳述したようにネストされたリソースを実行し、当日のみをロードすることをお勧めします。何日もロードする必要がある場合は、UJS (Ajax) を介して簡単にリクエストし、同じページにロードできます。

サーバーを溶かさないようにするために、おそらくやりたいことは、時間入力を自動保存するか、グループ化がフォーカスを失ったときに毎日の時間入力を自動保存することです。

于 2012-05-16T20:43:49.523 に答える