2011-01-16 4 views
1

У меня есть модель, назовем ее Foobar. Я хочу иметь возможность запуска задания cron для обновления атрибута всех объектов, которые являются экземплярами Foobar. Так, в псевдокоде, это может быть что-то вроде этого:Доступ к методу класса из модели в Rakefile/Ruby on Rails 3

Foobar.all.each do |foobar| 
    foobar.update_attributes({:my_attribute => 'updated'}); 
end 

Теперь, скажем, я обертку в методе класса под названием Foobar.run_update().

Вызов Foobar.run_update() будет нормально работать с контроллером или даже с точки зрения. Но я хочу сделать run_update() из Rakefile, чтобы я мог привязать его к запуску cron. Но класс Foobar недоступен для Rake, когда он вызывается из crontab.

Как я могу это решить? Как я могу получить доступ к классам методов Foobars от Rake, когда Rake вызывается из cron?

Большое спасибо за помощь.

+0

С помощью рейка вы имеете в виду рейк-задачу? – Chirantan

+0

Если вы принимаете самый высокий голосовой ответ, вы утроите свою репутацию! : O –

ответ

1

Вы можете загрузить среду Rails, требуя конфигурации/environment.rb:

ENV["RAILS_ENV"] ||= "production" 
require '/where/your/rails/project/is/config/environment.rb'
0

В моих программах Sinatra я обычно есть файл models/init.rb, который требует Sequel, устанавливает мое подключение к БД, а затем использует require_relative, чтобы потребовать все мои файлы модели. Затем мое основное приложение require_relative "models/init".

С этой настройкой любой другой скрипт (включая IRB), который мне нужно сделать, это сам файл models/init.rb, и у меня есть полный доступ к тем же моделям и соединению с БД, которое имеет приложение.

11

С помощью рейка, если вы имеете в виду задачу рейка, то добавление => :environment загружает среду рельсов для задачи, и вы сможете вызвать метод Foobar.run_update. Мол,

namespace :foobar do 
    task :update => :environment do 
    Foobar.run_update 
    end 
end 

И вы просто должны быть в состоянии назвать rake foobar:update из консоли и он запланирован как cronjob.