Как запустить задачи Ruby, использующие мои модели Rails?
У меня есть приложение Rails с некоторыми базовыми моделями. На веб-сайте отображаются данные, полученные из других источников. Поэтому мне нужно написать Ruby script, который создает новые экземпляры в моей базе данных. Я знаю, что могу сделать это с помощью тестовых крючков, но я не уверен, что это имеет смысл здесь.
Я не уверен, как должна выглядеть эта задача, как я могу ее вызывать, или куда она должна идти в моем исходном дереве (lib\tasks?).
Например, здесь моя первая попытка:
require 'active_record'
require '../app/models/mymodel.rb'
test = MyModel.new
test.name = 'test'
test.save
Это не удается, потому что невозможно получить соединение с базой данных. Это имеет смысл неопределенным способом для моего новичка мозга, так как, по-видимому, Rails делает всю волшебную работу за кулисами, чтобы установить все это. Итак, как мне настроить свой маленький script?
Ответы
Ответ 1
Я согласен с ответом выше, но вы должны включить = > : окружение в свою задачу или не загружать среду Rails.
например.
namespace :send do
namespace :trial do
namespace :expiry do
desc "Sends out emails to people who accounts are about to expire"
task :warnings => :environment do
User.trial_about_to_expire.has_not_been_notified_of_trial_expiry.each do |user|
UserMailer.deliver_trial_expiring_warning(user)
user.notified_of_trial_expiry = true
user.save
end
end
end
end
end
Ответ 2
Вы можете загружать всю среду рельсов в любой ruby script, просто требуя environment.rb:
require "#{ENV['RAILS_ROOT']}/config/environment"
Это предполагает, что переменная окружения RAILS_ROOT установлена, см. мой комментарий для других способов сделать это.
У этого есть дополнительный бонус предоставления вам всех хороших классов и объектов, которые у вас есть в остальном коде вашего рельса.
Для запуска ваших процессов это похоже на то, что cron сделает то, что вы хотите, и я также добавлю задачу в ваш рецепт capistrano, который добавит ваш script в crontab, чтобы периодически получать данные из внешнего источника и обновления вашей БД. Это можно легко сделать с помощью cronedit gem.
Подход cron имеет некоторые недостатки, в основном служебные и управляющие, для других более сложных опций см. HowToRunBackgroundJobsInRails из вики-ссылки rails.
Ответ 3
Я бы предложил создать пользовательские задачи rake (lib/task/foo.rake). Это дает вам легкий доступ к большинству функций вашего приложения rails.
namespace :foo do
desc 'do something cool'
def something_cool
test = MyModel.new
test.name = 'test'
test.save
end
end
Тогда:
$ rake -T foo
rake foo:something_cool # do something cool
Вы даже можете запускать задачи с помощью cronjob.
Ответ 4
Я написал сообщение об этом некоторое время назад.
http://www.rawblock.com/2007/06/14/ruby-oracle-mac-os-x-pain-jruby-and-activerecord-jdbc-to-the-rescue/
Ответ 5
Вы можете открыть соединение в своих сценариях как таковое:
ActiveRecord::Base.establish_connection(
:adapter => "mysql",
:username => "root",
:host => "localhost",
:password => "******",
:database => "******"
)
Я уверен, что есть более элегантный способ сделать это, чтобы он захватывал информацию из вашей базы данных .yml.
Ответ 6
Есть несколько шагов для этого и более подробная информация, необходимая для правильного ответа.
Вы говорите, что ваш сайт извлекает данные из других источников? Как часто? Если это полу-регулярно, вы определенно хотите посмотреть в фоновой обработке/обмене сообщениями. Если вы часто хотите избежать загрузки среды рельсов каждый раз, когда ваш script работает, так как вы будете платить слишком высокий налог на запуск каждый раз.
Существует множество вариантов, которые вы хотите исследовать. Читая о каждом из них, особенно отзывы от людей, которые публикуют о том, почему они сделали выбор, который они сделали, дадут вам хорошее представление о том, какие вопросы вы должны задать себе, прежде чем делать свой выбор. Насколько велика работа по загрузке данных? и т.д...
Сверху моей головы это некоторые из вещей, которые вы можете захотеть заглянуть в
Script/Бегун и Крон
Предпосылки /RB
Скворец
Workling
MemcacheQ
Beanstalk
Фоновое задание (Bj)
delayed_job (Dj)
Генератор демона
Ответ 7
Проверьте мой ответ в разделе Задача cron для рельсов: лучшие практики?".
Он содержит два примера использования cron для запуска задач Rake и методов класса (через script/runner
). В обоих случаях загружается Rails, и вы можете использовать свои модели.
Ответ 8
Nice Joyent записывает использование rake для запуска задач рельсов из задания cron - http://wiki.joyent.com/accelerators:kb:rails:cron
Ответ 9
Самый простой способ запуска рубиновых задач, которые взаимодействуют с приложением/моделями rails, - это сделать Rails для создания задач Rake!:)
Здесь пример
-
run rails g task my_namespace my_task
-
Это создаст файл с именем lib/tasks/my_namespace.rake
, который выглядит так:
namespace :my_namespace do
desc "TODO: Describe your task here"
task :my_task1 => :environment do
#write any ruby code here and also work with your models
puts User.find(1).name
end
end
-
Запустите эту задачу с помощью rake my_namespace:my_task
-
Наблюдайте за своей задачей ruby-кода, которая взаимодействует с модой Rails!