Railsの日付範囲によるレポートの生成
-
02-07-2019 - |
質問
Railsアプリでユーザーが選択した日付範囲ごとにレポートを作成するにはどうしますか?最適な日付範囲ピッカーとは何ですか?
patrickに対応する編集:ウィジェットとアクティブなレコードアドバイスの両方を探していますが、ユーザーが選択した日付に基づいて日付範囲リストを安らかに表示する方法に本当に興味があります。
解決
ここでインターフェースの質問(つまり、ウィジェットが必要)またはActiveRecordの質問ですか?
日付選択ウィジェット
1)デフォルトのRailsソリューション: date_select
のドキュメントを参照こちら。
2)プラグインを使用する:コードを記述する理由個人的には、 CalendarDateSelect プラグインが好きで、範囲が必要なときに吸盤を使用します。
3) JavascriptウィジェットをRailsに適応させる:Yahoo UIライブラリ(YUI)カレンダー(すべてJavascript)をRailsに送信します。 Railsの観点からは、 params [:start_date]
と params [:end_date]
にデータを入力するもう1つの方法です。 YUIカレンダーには範囲のネイティブサポートがあります。
ウィジェットからデータを取得する
1)デフォルトのRailsソリューション date_select
のドキュメントを参照こちら。
#an application helper method you'll find helpful
#credit to http://blog.zerosum.org/2007/5/9/deconstructing-date_select
# Reconstruct a date object from date_select helper form params
def build_date_from_params(field_name, params)
Date.new(params["#{field_name.to_s}(1i)"].to_i,
params["#{field_name.to_s}(2i)"].to_i,
params["#{field_name.to_s}(3i)"].to_i)
end
#goes into view
<%= date_select "report", "start_date", ... %>
<%= date_select "report", "end_date", ... %>
#goes into controller -- add your own error handling/defaults, please!
report_start_date = build_date_from_params("start_date", params[:report])
report_end_date = build_date_from_params("end_date", params[:report])
2) CalendarDateSelect :上記と似ていますが、よりセクシーなUIが表示されます。
3) Javascriptウィジェットの調整:通常、これは、一部のフォーム要素に文字列として日付入力が含まれることを意味します。 Date.parseは重大な魔法であるため、すばらしいニュースです。 params [:some_form_element_name]はRailsによって初期化されます。
#goes in controller. Please handle errors yourself -- Javascript != trusted input.
report_start_date = Date.parse(params[:report_start_date])
ActiveRecordの呼び出しの作成
パイのように簡単。
#initialize start_date and end_date up here, by pulling from params probably
@models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?',
start_date, end_date])
#do something with models
他のヒント
選択されたレコードの範囲をURLパラメーターで制御するのは、無茶なやり方ではありません。インデックスアクションで、Patrickが提案したことを実行し、これを実行できます。
#initialize start_date and end_date up here, by pulling from params probably
@models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?', params[:start_date], params[:end_date]])
インデックスビューで、?start_date = 2008-01-01&amp; end_date = 2008-12-31をURLに追加するフォームを作成します。ユーザー指定の入力であることに注意してくださいので、注意してください。インデックスアクションで画面に戻す場合は、次のようにしてください:
Showing records starting on
<%= h start_date %>
and ending on
<%= h end_date %>