質問

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

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

単一のエントリは次のようになります。

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

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

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

スケジュールを照会しながら、月曜日から日曜日までの曜日ごとに結果をグループ化し、順序付けする必要があります。もちろん、開始日までに毎日のクラスを順序付けします。

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

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

役に立ちましたか?

解決

曜日を整数として保存するだけです。 0 =>月曜日... 6 =>日曜日(またはあなたが望む任意の方法。すなわち、0 = gt;日曜日)。次に、開始時刻と終了時刻をTimeとして保存します。

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

これは複数の方法で表示できますが、ここに私がすることを示します。

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

    def find_sunday_classes
      find_by_day_of_week(1, :order -> 'start_time')
    end

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

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

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

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

他のヒント

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

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

tが時間の場合

t.strftime('%A')

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

したがって、開始時刻と終了時刻、または開始時刻と期間のみを保存する必要があります。両方とも同等でなければなりません。終了時刻でデータ操作を行う必要がある場合は、計算する必要がないため、終了時刻を自分で保存したいと思います。

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

平日および時間による順序付けは、時間列による順序付けの問題になります。すなわち

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

日ごとのグループ化は、少し厄介です。少し。ただし、これは素晴らしい投稿です週ごとにグループ化する方法について。日ごとのグループ化も同様です。

大量のデータを処理する場合は、データベースで find_by_sql を使用する方が適切な場合がありますが、これはデータベースの時刻と日付の機能に依存しますが、データを時間として保存することもここで役立ちます。たとえば、私が使用しているPostgresqlでは、クラスの週を取得することは

です。
date_trunc('week', starting_time)

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

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

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top