2009-07-21 1212 views
5

Giải pháp Cron trong đường ray rất nhiều và khá tốt. Đó không phải là những gì tôi đang đấu tranh với ở đây. Thay vào đó, những gì tôi gặp phải là cho phép người dùng tạo các tác vụ lặp lại của riêng mình (như lời nhắc) - cụ thể cách tạo mô hình và lưu trữ các công việc này trong DB (một giao diện người dùng tốt cho nó cũng không quan trọng - sẽ là tuyệt vời nếu có mã ra có cho điều đó). Lịch Google là một ví dụ tuyệt vời ở đây (giao diện người dùng để thêm sự kiện, không phải toàn bộ lịch) ... họ có thể thực hiện hàng ngày vào lúc 1 giờ chiều CST hoặc mon/wed/fri hoặc hàng tuần, v.v. được sử dụng sau đó sẽ cần phải thăm dò ý kiến ​​cơ sở dữ liệu để xem những lời nhắc cần thiết để được gửi vào giờ đó, v.v.Làm cách nào để lập mô hình và lưu trữ các tác vụ định kỳ trong đường ray?

Bất cứ ai nhìn thấy một plugin/đá quý tốt cho điều này trong đường ray? Có vẻ như sẽ có thứ gì đó ngoài kia, nhưng tôi vẫn chưa tìm thấy nó.

Cảm ơn!

+0

Tôi đang tìm chính xác điều tương tự! Bạn có tìm thấy giải pháp cho vấn đề của mình không? – Zabba

+0

xem câu trả lời được chấp nhận của tôi dưới đây - cuộn giải pháp đơn giản của riêng tôi –

Trả lời

5

Tôi đã kết thúc giải pháp của riêng mình vì tôi không cần bất cứ điều gì siêu lạ mắt.

Về cơ bản tôi đã thêm một cột ngày next_runinterval chuỗi vào db là một trong (ngày, tuần, v.v ...). Sau đó, thiết lập một công việc cron để chạy tìm kiếm bất kỳ ngày next_run nào đã trôi qua. Nó chạy chúng và sau đó đặt next_run cho một số điểm trong tương lai dựa trên cột interval.

Đơn giản nhưng phù hợp với nhu cầu của tôi.

1

Hiện nay suy nghĩ về việc sử dụng một plugin như thế này để lưu trữ tái phát trong một bảng http://github.com/fnando/recurrence/tree/master

từng nhắc nhở sẽ có một đối tượng tái phát, và nhắc nhở cũng sẽ giữ một lĩnh vực datetime khi nó là nghĩa vụ phải gửi nó kế tiếp. Sau đó, cron có thể ...

get all reminder's whose "next_send" date has passed 
for each reminder 
    send it 
    update the "next_send" field using the recurrence object 
end 

Nếu có giải pháp tốt hơn hoặc tôi đi sai đường dẫn, nhập luôn được đánh giá cao.

1

Tôi luôn tìm thấy giải pháp ical (RFC, không phải chương trình) là phương pháp tốt nhất để làm việc với các sự kiện định kỳ. Có một vài thư viện Ruby tốt để xử lý ical, và đứa trẻ mới nhất trên khối là ri_cal.

+0

rical trông rất tuyệt vời và đầy đủ các tính năng, tôi sắp xếp nhầm lẫn về cách nó có thể tích hợp với đường ray. Liệu nó lưu trữ các sự kiện hoặc các đối tượng lịch vào cơ sở dữ liệu? Làm thế nào bạn sẽ tìm kiếm các sự kiện do quá khứ hoặc làm các truy vấn? Cảm ơn! –

+0

looking => tra cứu –

+1

không may trông giống như rical không cho phép bạn lưu bất kỳ thứ gì vào cơ sở dữ liệu .... nó chỉ để đọc/tạo tệp ical –

0

tôi đang có vấn đề này và các giải pháp mà tôi đang xem xét như sau:

class AllowReoccuringTasks < ActiveRecord::Migration 
    def self.up 
     add_column :tasks, :reoccuring, :boolean 
     add_column :tasks, :period, :integer 
    end 
end 

nơi thời gian có thể là 1 (mỗi ngày), 7 (mỗi tuần), hoặc 14 (mỗi tuần khác).

Nếu bạn muốn hỗ trợ các loại lịch biểu khác như hàng tháng, ngày thường, cuối tuần, v.v., bạn có thể thêm cột được gọi là "lịch biểu" và sử dụng hằng số để biểu thị các loại lịch biểu khác nhau. Bạn cũng có thể sử dụng số enum plugin.