Как запустить задачи Ruby, использующие мои модели Rails? - PullRequest
13 голосов
/ 16 ноября 2008

У меня есть приложение Rails с некоторыми базовыми моделями. На сайте отображаются данные, полученные из других источников. Поэтому мне нужно написать скрипт на Ruby, который создает новые экземпляры в моей базе данных. Я знаю, что могу сделать это с помощью тестовых зацепок, но я не уверен, что здесь есть смысл.

Я не уверен, как должна выглядеть эта задача, как я могу ее вызвать или куда она должна идти в моем исходном дереве (lib \ tasks?).

Например, вот моя первая попытка:

require 'active_record'
require '../app/models/mymodel.rb'

test = MyModel.new
test.name = 'test'
test.save

Это не удалось, поскольку он не может подключиться к базе данных. Это имеет смысл в моём мозгу новичка, так как, по-видимому, Rails делает всю магическую работу за кулисами, чтобы настроить все это. Так как мне настроить мой маленький скрипт?

Ответы [ 9 ]

18 голосов
/ 16 ноября 2008

Вы можете загрузить всю среду rails в любом скрипте ruby, просто требуя environment.rb:

require "#{ENV['RAILS_ROOT']}/config/environment" 

Предполагается, что переменная среды RAILS_ROOT установлена, см. Мой комментарий для других способов сделать это.

Это дает дополнительный бонус, предоставляя вам все классы и классы, которые есть у вас в оставшейся части кода вашего рельса.

Чтобы запустить ваши процессы, звучит так, как будто cron будет делать то, что вы хотите, и я бы также добавил задачу к вашему рецепту capistrano, которая добавит ваш скрипт в crontab, чтобы периодически получать данные из внешнего источника и обновлять вашу БД , Это легко сделать с помощью драгоценного камня cronedit .

Подход cron имеет некоторые недостатки, в основном это издержки и контроль, другие более сложные опции см. HowToRunBackgroundJobsInRails из вики rails.

7 голосов
/ 16 ноября 2008

Я согласен с ответом выше, но вы должны включить = =: среду в вашу задачу, иначе она не будет загружать среду Rails.

например.,

namespace :send do
  namespace :trial do
    namespace :expiry do
      desc "Sends out emails to people who's 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
3 голосов
/ 16 ноября 2008

Я бы предложил создать пользовательские грабли (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.

2 голосов
/ 16 ноября 2008

Я написал пост об этом некоторое время назад.

http://www.rawblock.com/2007/06/14/ruby-oracle-mac-os-x-pain-jruby-and-activerecord-jdbc-to-the-rescue/

1 голос
/ 18 ноября 2008

Проверьте мой ответ в " Работа cron для рельсов: лучшие практики? ".

Содержит два примера использования cron для запуска задач Rake и методов класса (через script/runner). В обоих случаях загружается Rails, и вы можете использовать свои модели.

1 голос
/ 16 ноября 2008

Есть несколько шагов к этому, и для правильного ответа нужно больше деталей.

Вы говорите, что ваш сайт получает данные из других источников? Как часто? Если это происходит регулярно, вы определенно хотите изучить фоновую обработку / обмен сообщениями. Если это часто, вы действительно хотите избегать загрузки своей среды rails каждый раз, когда запускается ваш скрипт, так как вы будете каждый раз платить слишком высокий стартовый налог.

Существует множество вариантов, которые вы захотите исследовать. Читая о каждом из них, особенно отзывы людей, которые пишут о том, почему они сделали свой выбор, вы сможете лучше понять, какие вопросы вам нужно задать перед тем, как сделать свой выбор. Насколько большая работа загружает данные? и т.д ...

Вне моей головы, вот некоторые вещи, которые вы, возможно, захотите посмотреть

Скрипт / Бегун и Крон Предпосылки / RB Скворец Workling MemcacheQ Beanstalk Фоновая работа (Bj) delayed_job (Dj) Генератор демонов

1 голос
/ 16 ноября 2008

Вы можете открыть соединение в своих скриптах следующим образом:

ActiveRecord::Base.establish_connection(
    :adapter  => "mysql",
    :username => "root",
    :host     => "localhost",
    :password => "******",
    :database => "******" 
)

Я уверен, что есть более элегантный способ сделать это, чтобы он брал информацию из вашего database.yml.

0 голосов
/ 31 июля 2015

Самый простой способ запуска задач ruby, взаимодействующих с приложением / моделями rails, - это заставить Rails генерировать задачи Rake для вас !! :)

Вот пример

  1. пробег rails g task my_namespace my_task

  2. Будет сгенерирован файл с именем 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
  1. Запустите эту задачу с rake my_namespace:my_task

  2. Наблюдайте за задачей ruby ​​code, которая взаимодействует с модальным прогоном rails!

0 голосов
/ 17 ноября 2008

Nice Joyent описывает использование rake для запуска задач rails из задания cron - http://wiki.joyent.com/accelerators:kb:rails:cron

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...