Đây là cách tôi sẽ làm mẫu này. Tôi đã không sử dụng Lịch Google nhiều, vì vậy tôi đang dựa vào chức năng của các sự kiện lặp lại của iCal.
Tất cả các mô hình phải có thuộc tính id, created_at, updated_at thông thường. Được liệt kê là các thuộc tính tùy chỉnh. Nếu thuộc tính là một mô hình khác, bạn sẽ triển khai một liên kết như has_one
hoặc belongs_to
.
RecurrencePeriod
Event
base_event # has_one :base_event, :class_name'Event'
Time
end_date # có thể con số không, nếu nó tái mãi mãi
WeeklyRecurrence
tái phát # has_one :recurrence, :as=>:recurrence
Array[OccurrenceOverride]
ghi đè # has_many :overrides, :class_name=>'OccurrenceOverride'
Các RecurrencePeriod
bắt đầu vào ngày base_event của nó bắt đầu. Ngoài ra, tôi giả định rằng employee_id của Event
chỉ đến nhân viên đã tạo ra sự kiện đó. Một RecurrencePeriod
cũng sẽ thuộc về nhân viên đã tạo base_event.
Mô hình phụ thuộc vào độ linh hoạt mà bạn muốn có thể chỉ định sự lặp lại. Bạn sẽ hỗ trợ "Thứ Ba và Thứ Năm cứ hai tuần một lần từ 10 giờ sáng đến 11 giờ sáng và từ 2 giờ chiều đến 3 giờ chiều" hay chỉ "lặp lại hàng tuần"? Dưới đây là một mô hình chỉ hỗ trợ "lặp lại hàng tuần", "lặp lại hai tuần một lần", v.v. bạn có thể mở rộng nó nếu bạn cần.
WeeklyRecurrence
Integer
weeks_between_recurrences
RecurrencePeriod
RECURRENCE_PERIOD # belongs_to :recurrence, :polymorphic=>true
tôi sử dụng polymorphic associations đây, bởi vì tôi nghĩ rằng họ có thể có ích nếu bạn muốn nhiều hơn một loại của sự tái diễn, chẳng hạn như cả WeeklyRecurrence
và DailyRecurrence
. Nhưng tôi không chắc chắn rằng đó là cách chính xác để mô hình hóa điều đó, vì vậy nếu chúng không thành công, chỉ cần sử dụng has_one :weekly_recurrence
và belongs_to :recurrence_period
thay thế.
Thư viện Ice cube có vẻ hữu ích khi tính toán các lần lặp lại. Nếu WeeklyRecurrence
ở trên không đủ mạnh, bạn có thể chỉ muốn lưu trữ đối tượng Ice cube Schedule
trong một mô hình, thay thế WeeklyRecurrence
. Để lưu trữ một đối tượng Schedule
trong một mô hình, hãy lưu đối tượng đó dưới dạng thuộc tính "lịch biểu", đặt serialize :schedule
vào định nghĩa mô hình và tạo cột "lịch biểu" trong cơ sở dữ liệu.
OccurrenceOverride
xử lý trường hợp một phiên bản duy nhất của sự kiện lặp lại đang được chỉnh sửa.
OccurrenceOverride
RecurrencePeriod
recurrence_period_to_override # belongs_to :recurrence_period_to_override, :class_name=>'RecurrencePeriod'
Time
original_start_time # xác định duy nhất mà tái phát trong vòng RecurrencePeriod rằng để thay thế
Event
replacement_event # has_one :replacement_event, :class_name=>'Event'
; có thể con số không, nếu tái phát mà đã bị xóa thay vì sửa
Thay vì lưu trữ mỗi lần xuất hiện của một sự kiện riêng lẻ, tạo cho họ tạm thời khi bạn cần phải cho họ thấy trong giao diện. Trong RecurrencePeriod
, tạo phương thức generate_events_in_range(start_date, end_date)
tạo ra Event
s, không lưu vào cơ sở dữ liệu, nhưng chỉ để chuyển sang chế độ xem để có thể hiển thị chúng.
Khi người dùng chỉnh sửa lặp lại, họ phải có tùy chọn sửa đổi tất cả các lần xuất hiện, tất cả các lần xuất hiện trong tương lai hoặc chỉ sự kiện đó. Nếu họ sửa đổi tất cả các lần xuất hiện, hãy sửa đổi base_event của RecurrencePeriod
. Nếu họ sửa đổi tất cả các lần xuất hiện trong tương lai, hãy sử dụng phương pháp bạn nên thực hiện trên RecurrencePeriod
chia tách chính nó thành hai RecurrencePeriod
s ở hai bên của một ngày nhất định, sau đó lưu các thay đổi chỉ vào giai đoạn thứ hai. Nếu họ chỉ sửa đổi sự kiện đó, hãy tạo một OccurrenceOverride
cho thời gian chúng ghi đè và lưu các thay đổi đối với replace_event của ghi đè.
Khi người dùng nói một sự kiện nhất định sẽ tái diễn sau mỗi hai tuần trong tương lai gần, bạn nên tạo RecurrencePeriod
mới với sự kiện đó là base_event và nil end_date. Sự lặp lại của nó phải là WeeklyRecurrence
mới với tuần_between_recurrence = 2 và nó sẽ không có OccurrenceOverride
s.
Bất kỳ vấn đề nào từ trải nghiệm không có sự cố xảy ra liên tục mặc dù không thể truy cập bằng id? (hiệu suất, độ phức tạp, v.v.) – ted
@ted Câu hỏi hay. Tôi chưa bao giờ triển khai điều này, vì vậy tôi e rằng tôi không biết liệu có xảy ra sự cố khi cần thiết hay không. Tôi cho rằng bạn có thể thiết lập bộ nhớ cache cho các lần xuất hiện được tạo nếu cần. Một hệ thống bộ nhớ đệm có thể sử dụng thực tế là một lần xuất hiện được tạo ra để lưu là khái niệm rất giống với một 'OccurrenceOverride', mặc dù không giống nhau. –