ice_cube là một thư viện của Ruby dùng để xử lý các event xảy ra định kỳ hoặc lặp đi lặp lại. Nó giúp chúng ta xử lý các events đó dễ dàng và rất nhanh.
Ví dụ cơ bản nhất là dùng để tạo các event trên calendar chẳng hạn.
Cài đặt
1 2 3 4 5 6 7 | gem "ice_cube" // hoặc gem install ice_cube |
Cách sử dụng
Vi dụ bạn muốn hiển thị các event xảy ra :
Every friday the 13th that falls in October
Vậy nếu mình tự viết thì nó sẽ phức tạp. Với ice_cube thì mình sẽ xử lý bài toán này rất đơn giản như sau.
1 2 3 4 5 6 7 8 | <span class="token comment"># khởi tạo object</span> schedule <span class="token operator">=</span> <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Schedule</span><span class="token punctuation">.</span><span class="token keyword">new</span> <span class="token comment"># tạo rule cho schedule trên</span> schedule<span class="token punctuation">.</span><span class="token function">add_recurrence_rule</span><span class="token punctuation">(</span> <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span>yearly<span class="token punctuation">.</span><span class="token function">day_of_month</span><span class="token punctuation">(</span><span class="token number">13</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">day</span><span class="token punctuation">(</span><span class="token symbol">:friday</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">month_of_year</span><span class="token punctuation">(</span><span class="token symbol">:october</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> |
Từ object đó mính sẽ gọi được các method có sẵn của ice_cube như lấy tất cả các events, check schedule đó có xảy ra trên ngày nào đấy không, …. có rất nhiều method mình có thể dùng được. Dưới đây sẽ là một số method và cách sử dụng nó.
Khởi tạo schedule object
1 2 | schedule = IceCube::Schedule.new(start_time = Time.now, end_time) |
start_time và end_time là optional
Tạo rules cho schedule
Có nhiều loại rules như sau:
Daily
1 2 3 4 5 6 | <span class="token comment"># every day</span> schedule<span class="token punctuation">.</span>add_recurrence_rule <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span>daily <span class="token comment"># every n day</span> schedule<span class="token punctuation">.</span>add_recurrence_rule <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span><span class="token function">daily</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span> |
Weekly
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token comment"># every week</span> schedule<span class="token punctuation">.</span>add_recurrence_rule <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span>weekly <span class="token comment"># every other week on monday and tuesday</span> schedule<span class="token punctuation">.</span>add_recurrence_rule <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span><span class="token function">weekly</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">day</span><span class="token punctuation">(</span><span class="token symbol">:monday</span><span class="token punctuation">,</span> <span class="token symbol">:tuesday</span><span class="token punctuation">)</span> <span class="token comment"># for programmatic convenience (same as above)</span> schedule<span class="token punctuation">.</span>add_recurrence_rule <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span><span class="token function">weekly</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">day</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment"># specifying a weekly interval with a different first weekday (defaults to Sunday)</span> schedule<span class="token punctuation">.</span>add_recurrence_rule <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Rule</span><span class="token punctuation">.</span><span class="token function">weekly</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token symbol">:monday</span><span class="token punctuation">)</span> |
Tương tự với các rules trên:
- monthly
- yearly
- hourly
- minutely
- secondly
Chi tiết về các rules đó bạn vào xem tài liệu của nó.
Gọi các method cần thiết
Sau khi bạn đã khởi tạo schedule, add rule cho schedule đó xong, tiếp theo mình có thể gọi các method mình cần.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token comment"># lấy ra các events cho đến end_time</span> occurrences <span class="token operator">=</span> schedule<span class="token punctuation">.</span><span class="token function">occurrences</span><span class="token punctuation">(</span>end_time<span class="token punctuation">)</span> <span class="token comment">#lấy ra tất cả các events </span> occurrences <span class="token operator">=</span> schedule<span class="token punctuation">.</span>all_occurrences <span class="token comment"># kiểm tra schedule đó có xảy ra ở trong thời gian nào đó không </span> <span class="token comment"># for single time</span> schedule<span class="token punctuation">.</span>occurs_at<span class="token operator">?</span><span class="token punctuation">(</span>now <span class="token operator">+</span> <span class="token number">1.</span>day<span class="token punctuation">)</span> <span class="token comment"># for single day</span> schedule<span class="token punctuation">.</span>occurs_on<span class="token operator">?</span><span class="token punctuation">(</span><span class="token constant">Date</span><span class="token punctuation">.</span>today<span class="token punctuation">)</span> <span class="token comment"># lấy first(n) của events</span> schedule<span class="token punctuation">.</span><span class="token function">first</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> schedule<span class="token punctuation">.</span>first <span class="token comment"># lấy last(n) của events</span> schedule<span class="token punctuation">.</span><span class="token function">last</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> schedule<span class="token punctuation">.</span>last <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> |
Như ví dụ trên bạn sẽ biết cách gọi method thế nào rồi, còn khá nhiều methods nữa, bạn có thể vào tài liệu của nó để xem chi tiết.
Persistence
Trên thực tế người dùng sẽ tạo rules đó trên UI chứ không phải bằng code, vậy làm thế nào để lưu các rules đó vào db được?
Mình sẽ implement theo cách dưới đây:
- Tạo UI chọn events:
Ở đây, nếu bạn muốn tự code form cũng được. Mình sẽ nhận được params cần thiết từ form đó để dùng cho việc tạo rulé cho schedule.
Nhưng để hỗ trợ việc tạo form dễ dàng, ở đây cũng có gem https://github.com/GetJobber/recurring_select
Nó sẽ generate sẵn form để hỗ trợ trong việc chọn các rules cho bạn rồi.
- Tạo rules:
Sau khi bạn đã có form rồi, tiếp theo bạn cần phải lấy params từ form đó và tạo rule cho event đấy.
Cuối cùng sẽ lưu rule đã tạo đó vào db.
Mình có thể lưu rules dưới dạng yaml, hash, ical.
1 2 3 4 5 6 7 8 9 | yaml <span class="token operator">=</span> schedule<span class="token punctuation">.</span>to_yaml <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Schedule</span><span class="token punctuation">.</span><span class="token function">from_yaml</span><span class="token punctuation">(</span>yaml<span class="token punctuation">)</span> hash <span class="token operator">=</span> schedule<span class="token punctuation">.</span>to_hash <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Schedule</span><span class="token punctuation">.</span><span class="token function">from_hash</span><span class="token punctuation">(</span>hash<span class="token punctuation">)</span> ical <span class="token operator">=</span> schedule<span class="token punctuation">.</span>to_ical <span class="token constant">IceCube</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Schedule</span><span class="token punctuation">.</span><span class="token function">from_ical</span><span class="token punctuation">(</span>ical<span class="token punctuation">)</span> |
Từ data đó mình chỉ lưu nó và db là xong.
Conclusion
Đến đây bạn đã hiểu về cách cài đặt cũng như sử dụng gem này rồi.
Chi tiết hãy xem các tài liệu sau: