2011-01-05 7 views
7

phép nói rằng tôi có một cronjob như thế này:Rails - Bất cứ khi nào đá quý - Năng động, giá trị

every 1.day, :at => '4:30 am' do 
    runner "MyModel.task_to_run_at_four_thirty_in_the_morning" 
end 

Mặc dù, tôi muốn thực hiện '1.day' năng động hơn, chẳng hạn như thay đổi giá trị thông qua một hình thức trong một trang quản trị.

Sau đó, nó có thể trông như thế này:

every Constant.find(2).value, :at => '4:30 am' do 

hoặc

@const = Constant.find(2) 
every @const.span, :at => @const.time do 

bất cứ ai có thể đưa ra một ý tưởng về làm thế nào để làm cho công việc này?

Rõ ràng, lý do cho điều này sẽ là tôi có thể sử dụng các giá trị được lưu trữ trong cơ sở dữ liệu trên trang web của tôi, giống như một thông báo nói

<%= "The next update is in less than #{@const.time}" #or something similar %> 

Trả lời

8

Tôi chưa bao giờ cố gắng, nhưng bạn sẽ có thể làm điều này bằng cách tải lên môi trường Rails trong bất cứ khi nào để bạn có thể sử dụng các lớp mô hình của bạn. Chỉ cần sử dụng require File.dirname(__FILE__) + "./environment" (hoặc "./application" cho Rails 3) trong lịch biểu của bạn.rb, giả sử lịch biểu của bạn.rb nằm trong thư mục cấu hình.

Tuy nhiên, vì tất cả khi nào tạo ra các dòng trong crontab, mọi thay đổi được thực hiện cho bất kỳ Constant nào sẽ yêu cầu chạy lại whenever --update-crontab.

10

Cảm ơn các bạn đang rảnh rỗi! Nó hoàn toàn hoạt động. Đây là giải pháp của tôi:

require "#{RAILS_ROOT}/config/environment.rb" 

@notification_daily = Constant.find_by_key("notification_daily_time_span") 
every eval(@notification_daily.value), :at => @notification_daily.additional_data do 
    runner "Notification.daily" 
end 

@notification_weekly = Constant.find_by_key("notification_weekly_time_span") 
every eval(@notification_weekly.value), :at => @notification_weekly.additional_data do 
    runner "Notification.weekly" 
end 

.Value có thể chứa ví dụ: 1.day hoặc : Chủ Nhật
.additional_data chứa dấu thời gian, ví dụ: 11:00

Và vâng, Tôi biết rằng tôi cần chạy --cập nhật crontab một lần nữa :)
Nhưng tôi sẽ tự cập nhật cronjob, hehe.

+0

Điều đó không làm việc cho tôi trong Rails4. Câu lệnh require không hoạt động. bất kỳ ý tưởng nào tôi cần phải thay đổi? – ShivamD

+1

Tôi chưa thử Rails 4, nhưng tôi nghĩ RAILS_ROOT được đổi thành Rails.root. – Frexuz

+0

@ Frexuz: Dòng này có nghĩa là gì, bạn có thể giúp tôi loại bỏ nó không. notification_weekly = Constant.find_by_key ("notification_weekly_time_span") - cũng là notification_weekly_time_span – SSR

6
# In rails 4 
require File.expand_path('../..//config/environment.rb', __FILE__) 

# This is your table by which you will get your new value 
bid_update = DynamicOfferTime.first 

# Now Task As 
every (bid_update.hour_value).hours do 
    puts "This will repeat in every #{bid_update.hour_value} hour" 
end 

Đừng quên cập nhật bất cứ khi nào

+0

Tôi cũng sử dụng đường ray 4, 'require '# {RAILS_ROOT} /config/environment.rb" 'hoạt động tốt ở đây. – Frexuz

+0

Cảm ơn, Nhưng tôi đã gặp vấn đề này và được giải quyết ở trên. – Mukesh