4

私がやりたいことは非常に単純ですが、これを行うための最良または最もエレガントな方法を見つけようとしています。私が今構築している Rails アプリケーションには、毎日のクラスのスケジュールがあります。各クラスについて、この質問に関連するフィールドは次のとおりです。

  • 曜日
  • 開始時間
  • 終了時間

単一のエントリは次のようなものです。

  • 曜日: 水曜日
  • 開始時間: 午前 10:00
  • 終了時間:正午

また、これはバイリンガルの Rails 2.2 アプリであり、ネイティブの i18n Rails 機能を使用していることにも言及する必要があります。実はいくつか質問があります。

曜日に関しては、曜日のリストを含む追加のテーブルを作成する必要がありますか、またはそのリストをその場で作成する組み込みの方法はありますか? これらの曜日は、ロケール変数に応じて、スケジュール ビューで英語またはスペイン語で表示する必要があることに注意してください。

スケジュールを照会している間、月曜日から日曜日までの平日で結果をグループ化して並べ替える必要があります。もちろん、開始時刻で各日のクラスを並べ替える必要があります。

各クラスの開始時間と終了時間について、日時フィールドと整数フィールドのどちらを使用しますか? 後者の場合、これを正確にどのように実装しますか?

皆さんが思いつくさまざまな提案を読むのを楽しみにしています。

4

3 に答える 3

4

曜日を整数として格納するだけです。0 => 月曜日 ... 6 => 日曜日 (または任意の方法。つまり、0 => 日曜日)。次に、開始時刻と終了時刻を Time として保存します。

これにより、グループ化が非常に簡単になります。曜日と開始時刻で並べ替えるだけです。

これはさまざまな方法で表示できますが、ここでは私が行う方法を示します。

  1. 次のような関数を用意します。@sunday_classes = DailyClass.find_sunday_classesこれは、日曜日のすべてのクラスを開始時刻でソートして返します。その後、毎日繰り返します。

    def find_sunday_classes
      find_by_day_of_week(1, :order -> 'start_time')
    終わり

    注: find_by にはおそらく最後に id が必要ですが、それは列に名前を付ける方法の好みにすぎません。

  2. 丸 1 週間必要な場合は、コントローラーから 7 つすべてを呼び出して、ビュー内でそれらをループします。毎日の詳細ページを作成することもできます。

  3. 翻訳は唯一のトリッキーな部分です。整数を受け取り、ローカルに基づいて適切な曜日のテキストを返すヘルパー関数を作成できます。

それは非常に基本的なことです。複雑なことは何もありません。

于 2009-01-09T21:23:47.937 に答える
2

データが時間の場合、それを時間として保存します。そうしないと、日付と時間に関連する操作を行うときに、常にデータベースから変換する必要があります。日は時間オブジェクトの一部になるため、冗長データです。

これは、日のリストを保存する必要がないことを意味するはずです。

t が時間の場合

t.strftime('%A')

は常に日を英語の文字列として返します。これは、必要に応じて i18n で翻訳できます。

したがって、開始時刻と終了時刻、または開始時刻と期間を保存するだけで済みます。どちらも同等である必要があります。終了時刻にデータ操作を行う必要がある場合に備えて、終了時刻を自分で保存したくなるので、計算する必要はありません。

あなたが説明する残りのほとんどは、時間データを Time のインスタンスとして保存することからも外れるべきだと思います。

曜日と時間でのご注文は、時間列でのご注文となります。すなわち

daily_class.find(:all, :conditions => ['whatever'], :order => :starting_time)

日ごとのグループ化は、もう少しトリッキーです。ただし、これは週ごとにグループ化する方法に関する優れた投稿です。日ごとのグループ化も同様です。

自明ではない量のデータを扱っている場合はfind_by_sql、データベースの時刻と日付の機能に依存する可能性がある and を使用して、データベースで処理する方がよい場合がありますが、データを Time として保存することもここで役立ちます。 . たとえば、Postgresql (私が使用) では、クラスの週を取得するのは

date_trunc('week', starting_time)

これは、Group By 句で使用したり、Rail のループ ロジックで使用する値として使用したりできます。

于 2009-01-09T11:53:53.487 に答える
1

曜日に関しては、たとえばMWFで09:00-10:00を満たすクラスが必要な場合は、クラスが満たす日(クラスIDとDOWの両方でキー設定)に別のテーブルを使用するか、悪(つまり、正規化されていない)であり、各クラスのDOWの配列と同等のものを保持します。古典的な議論はこれです:

  • 個別のテーブルは、クラス指向またはDOW指向の選択をサポートする方法でインデックスを付けることができますが、クラスの全体像をまとめるにはもう少し接着剤が必要です。
  • ダウの配列は、初心者のプログラマーにとっては視覚化が簡単で、コーディングも少し簡単ですが、ダウについて推論するには、すべてのクラスを調べる必要があることを意味します。

これがあなたの個人的なクラスのスケジュールのためだけであるならば、あなたが探している価値をあなたに与えることをして、そして結果と一緒に生きてください。複数のユーザー向けの実際のシステムを構築しようとしている場合は、別のテーブルを使用します。これらの正規化ルールはすべて、理由があります。

(人間が読める)DOW名に関しては、これはプレゼンテーション層の問題であり、DOWのコアコンセプトに含めるべきではありません。(モントリオールに移動することを決定し、フランス語が必要だったとしましょう。これは、コア実装への変更ではなく、別の「顔」である必要があります。)

開始/終了時間に関しても、問題はあなたの要件です。すべてのクラスが時間(x:00)の境界で開始および終了する場合、1日の時間として0..23を使用できます。しかし、その45分間のセミナーに対応しなければならないとしたら、あなたの人生は悲惨なものになるでしょう。古いコマーシャルが言ったように、「今すぐ支払うか、後で支払う」。

1つのアプローチは、独自のClassTimeの概念を定義し、時間に関するすべての推論をそのクラスに分割することです。単純な表現(整数時間0..23、または深夜0..1439からの整数分)で開始し、必要に応じて「成長」することができます。

于 2009-01-09T13:03:27.713 に答える