Подтвердить что ты не робот

Как запустить задачи 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?

4b9b3361

Ответ 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.

Ответ 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, и вы можете использовать свои модели.

Ответ 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
  1. Запустите эту задачу с помощью rake my_namespace:my_task

  2. Наблюдайте за своей задачей ruby-кода, которая взаимодействует с модой Rails!