8

曜日と時刻をデータベースに保存することについて、2 つの部分からなる質問があります。Rails 4.0、Ruby 2.0.0、および Postgres を使用しています。

特定のイベントがあり、それらのイベントにはスケジュールがあります。たとえば、「スカイダイビング」というイベントの場合、火曜日と水曜日、そして午後 3 時とします。

  1. 火曜日と水曜日のレコードを 1 つの行に保存する方法はありますか、それとも 2 つのレコードを保持する必要がありますか?
  2. 日付と時刻を保存する最良の方法は何ですか? 曜日と時刻 (datetime ではない) を保存する方法はありますか、それとも別々の列にする必要がありますか? それらを別々にする必要がある場合、曜日をどのように保存しますか? wdayTime クラスのメソッドがそれを行う方法なので、それらを整数値として保存することを考えていました。日曜日は 0、月曜日は 1 です。

どんな提案でも非常に役立ちます。

4

4 に答える 4

3

ice_cube gem (リンク) をチェックしてください。

データベースに永続化できるスケジュール オブジェクトを作成できます。2 つの別個のレコードを作成する必要はありません。2 番目の部分では、任意のルールに基づいてスケジュールを作成でき、それがデータベースにどのように保存されるかを心配する必要はありません。gem が提供するメソッドを使用して、永続化されたスケジュール オブジェクトから必要な情報を取得できます。

于 2013-11-10T21:15:34.430 に答える
3

スケジューリングのニーズがどれほど複雑かによって、データの保存方法に関するアイデアについて、iCalendarスケジューリング データ形式であるRFC 5545を参照することをお勧めします。

ニーズが非常に単純な場合、それはおそらくやり過ぎです。Postgresql には、日付と時刻を必要な形式に変換する関数が多数あります。

相対的な日付と時刻を保存する簡単な方法として、提案したように曜日を整数として保存し、時間をTIMEデータ型として保存できます。有効な曜日が複数ある場合は、ARRAY を使用することをお勧めします。

例えば。

  • ARRAY[2,3]::INTEGER[] = 火曜日、水曜日を曜日として
  • '15:00:00'::TIME = 午後 3 時

[編集:いくつかの簡単な例を追加]

/* Custom the time and timetz range types */
CREATE TYPE timerange AS RANGE (subtype = time);

--drop table if exists schedule;
create table schedule (
    event_id    integer not null, /* should be an FK to "events" table */
    day_of_week integer[],
    time_of_day time,
    time_range  timerange,
    recurring   text CHECK (recurring IN ('DAILY','WEEKLY','MONTHLY','YEARLY'))
);

insert into schedule (event_id, day_of_week, time_of_day, time_range, recurring)
values
(1, ARRAY[1,2,3,4,5]::INTEGER[], '15:00:00'::TIME, NULL, 'WEEKLY'),
(2, ARRAY[6,0]::INTEGER[], NULL, '(08:00:00,17:00:00]'::timerange, 'WEEKLY');

select * from schedule;

 event_id | day_of_week | time_of_day |     time_range      | recurring 
----------+-------------+-------------+---------------------+-----------
        1 | {1,2,3,4,5} | 15:00:00    |                     | WEEKLY
        2 | {6,0}       |             | (08:00:00,17:00:00] | WEEKLY

最初のエントリは次のように読むことができます: イベントは月曜日から金曜日の午後 3 時に有効で、このスケジュールは毎週発生します。
2 番目のエントリは、次のように読むことができます: イベントは毎週土曜日と日曜日の午前 8 時から午後 5 時まで有効です。

カスタム範囲タイプ「timerange」は、時間範囲の下限と上限を示すために使用されます。
「(」は「包括的」を意味し、末尾の「]」は「排他的」、つまり「午前 8 時以上午後 5 時未満」を意味します。

于 2013-11-10T21:17:57.843 に答える
1

日付スタンプを保存してから、組み込み機能を使用しDateて曜日を取得しないのはなぜですか?

2.0.0p247 :139 > Date.today
 => Sun, 10 Nov 2013 
2.0.0p247 :140 > Date.today.strftime("%A")
 => "Sunday" 

strftimeそれはあなたのためにすべてを行うことができるように聞こえます。 そのための具体的なドキュメントを次に示します。

特にあなたが話していることについては、タイムスタンプを持つEventテーブルがhas_many :schedules必要なように思えます...Schedulestart_date

于 2013-11-10T21:14:14.867 に答える