RoR でシンプルな道場出席アプリを作成しようとしていますが、現在、少なくとも出席記録の表示、作成、更新に関して、自分ができるとわかっていることと、できるようにしたいことの間で立ち往生しています。 . (アプリの残りの部分は私には簡単に思えます。)
問題のテーブルのスキーマは次のとおりです。
create_table "attendances", :force => true do |t|
t.date "class_date"
t.integer "student_id"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "class_hours", :default => 0
end
これには基本的な scaffold ビューを利用できることはわかっていますが、それを行うのは面倒です。つまり、新しい出席記録、日付、学生、および費やした時間を選択し、保存し、インデックス ビューに戻る (特定の月に限定されるように変更されています)。 . これは、1 回のレコード作成で多くのクリック数です。それ自体は恐ろしいことではありませんが、新しいエントリごとに退屈になっていることがわかります. とはいえ、システムのユーザーがその学生に間違った時間数が入力されたことに気付いた場合、このアプローチを更新するのは非常に簡単です。必要に応じて、レコードを完全に削除するのは非常に簡単です。
上記を次のように強化することができました。
- インデックス ビューには、クラスに出席したかどうかに関係なく、特定の月のすべての生徒が一覧表示されます
- おそらく、学生の名前を新しい出席ページへのリンクにします(上記で説明)
- 学生が問題の日付のその月のエントリを持っている場合、グリッド内のそのセルは、そのレコードの出席の編集ページへのリンクになります。
- [出席の編集] ページの下部に [削除] リンクを追加できると思います
私が本当に欲しいのは、次を提供するビューです。
- 一目でわかる月のグリッド (ビューの上部にある月の名前、理想的には jQuery の日付ピッカーを使用)
- グリッドの最初の列にすべての生徒がリストされます
- 各列のヘッダー (最初の列の後)、1 から N (月の最終日) までの月の日
- 特定の日付に学生の出席記録が存在する場合は、セルに時間を表示します
- 特定の日付の学生の出席記録が存在しない場合は、何も表示しません (または「-」または同様のプレースホルダーを表示します)。
私はこれを理解しようとしてぐるぐる回ってきました。グリッドがすべてのセルに値を持っている場合 (つまり、すべての学生が表示されている月のすべての日のレコードを持っている場合)、best_in_placeを使用してこれを乗り越えることができます。やった、やった。しかし、このようにテーブルを肥大化させることは、テーブルの非常に非効率的な使用のように思えます。特に次のことを考えると、a) 学生は、非常にひどいことをして禁止されない限り、名簿に永久に残る可能性が高いでしょう。道場から、b) 利用可能なすべてのクラスに誰も出席しない、c) 利用可能なクラスの大部分に参加する生徒はほとんどいない。レコードを表示するには、レコードが存在する必要があることを除いて、best_in_class_if で動作させることを検討しました。ああ。
私は最近、これを乗り越える方法として簡単に希望を与えてくれたfind_or_create_byについて知りました。次に、このcreate_or_update_byを作成するためのこのアプローチを知り、これを乗り越える方法として別の希望の光を与えてくれましたが、それを実現するためのアプローチ方法についてはまだ何かが私を悩ませていました。つまり、存在しないレコードへのグリッド (html テーブル) に何らかの参照を作成する必要がありますが、これは達成できないようです。(レールコンソールから create_or_update_by をテストしているときにも問題が発生しましたが、その理由を突き止めるLocalJumpError: no block given (yield)
ことができませんでした。)
月ごとの出席状況ビューで取得しようとしているルック アンド フィールがよくわからない場合は、それを Excel スプレッドシートと考えてください。セルが空の場合は値を追加でき、セルに値がある場合は変更できます。(青空: class_hours の値がゼロに設定されている場合は、レコードを削除します。)
ルートのドキュメントとコントローラーのドキュメントでインスピレーションを見つけようとしました。喜びはありません。
以下の点が考慮されている限り、代替の RoR ソリューションを喜んで検討します。
- その月のクラスに出席したかどうかに関係なく、システム内のすべての学生を一覧表示する出席月の一目でわかるビュー ( DataTablesを使用して、私はすでに活用に成功しています)
- 学生の出席を追加/更新するためのシンプルなアプローチ。理想的には、基本的な scaffold ビューよりも少ないクリック数で済みます
乾杯。
編集:さらに熟考すると、1つの合理的なアプローチは、出席テーブルにまだ表現されていないデータグリッド内のセルを、パラメーターstudent_id、class_date、およびclass_hoursを/に渡すリンクにすることです。出席/新しいルート (パラメーターを受け入れて使用するように scaffold から変更されたもの)、および同様に、既に値を持っているセルをクリックする場合。(後者の場合でも best_in_place を使用することを検討できますが、UI の一貫性を保つためには、おそらくそれを避ける必要があります。)
より良い方法でこれにアプローチする絶好の機会を逃した場合でも、洞察に満ちた提案を喜んで受け入れます.