RoR - где поставить автоматизированный процесс - PullRequest
1 голос
/ 18 февраля 2011

следующая ситуация (ror 3, ruby ​​1.9).

У меня есть модель с некоторыми полями.

Теперь я хочу получить JSON-канал (например, каждый час), сравнитьсодержание с моими сохраненными объектами модели и добавьте новый объект модели, если есть новый элемент в этом фиде json.

Я не уверен, куда поместить это автоматическое действие.я не думаю, что делать это в методе моделей - это правильное место, я прав?

где бы вы делали эту миграцию?в контроллере?не совсем, я думаю.

благодарен за все подсказки

Ответы [ 6 ]

3 голосов
/ 18 февраля 2011

Для этого полностью игнорируйте контроллеры. Модели служат уровнем абстракции для доступа к данным. В вашем случае у вас есть некоторые локально сохраненные данные в виде базы данных, и у вас есть удаленные данные, которые вы извлекаете как JSON через HTTP. Итак, у вас есть ваши обычные модели ActiveRecord, и у вас есть модель для ваших данных JSON.

Предположим, у вас есть модель с именем RemoteData, которая извлекает документ JSON и имеет несколько методов, позволяющих вам аккуратно получать из него данные. У вас также есть модель StoredData, которая хранит извлеченный контент в вашей базе данных для последующего отображения.

Теперь вы хотите автоматизировать процесс вызова RemoteData.fetch('url') и последующего вызова StoredData.create :params для возвращенных данных. Для этого вы должны создать «задание на грабли». Вот пример:

# lib/tasks/fetch.rake
desc "Fetch remote data and persist it"
task :fetch => :environment do
  RemoteData.fetch('url').each do |json_data|
    sd = StoredData.create :url => 'url', :data => json_data
    puts "Retrieved 'url' and saved data in record ##{sd.id} at #{DateTime.now}."
  end
end

Затем вы должны настроить системный crontab так часто, как вам хотелось бы. Задача Rake обрабатывает бизнес-логику, а ваши модели обрабатывают взаимодействие с данными. Красиво и чисто.

0 голосов
/ 18 февраля 2011

Вы должны сохранять пакетные задания, такие как обработка данных и заполнение из основного обслуживающего веб-приложения. Напишите скрипт ruby ​​/ rake и запустите его из cron.

Модель или контроллеры не правильные места.

Ниже приведен пример кода для написания сценариев, которые обращаются к моделям приложения.

require 'rubygems'
require 'active_record'

$config = YAML.load_file(File.dirname(__FILE__) + '/../green_app/config/'+ 'database.yml')
ActiveRecord::Base.establish_connection( $config[ENV['RAILS_ENV']] )
require File.expand_path File.dirname(__FILE__) + '/../green_app/app/models/post.rb'

и запустите его как

export RAILS_ENV="production" && ruby /path/to/your/script.rb

изменить значение RAILS_ENV в зависимости от вашей среды.

0 голосов
/ 18 февраля 2011

Вопрос здесь: вы чувствуете, что этот JSON является представлением или просто «представлением данных»? Если вы считаете первое, вам нужен обычный контроллер; если вы чувствуете, что это данные, то вы можете написать задачу rake и вызвать метод (что-то вроде: puts Model.scope1.scope2.to_json)

0 голосов
/ 18 февраля 2011

Я бы поместил код захвата фида json в модель, связанную с данными из фида.Вы можете написать тесты для метода grab_feed и быть уверенным, что он работает правильно.Например, если вы хотите удалить сообщения, я бы сделал что-то вроде этого:

class Post < ActiveRecord

  def self.grab_feed
    (...)
  end
end

Тогда вы можете использовать всякий раз, когда: https://github.com/javan/whenever, чтобы проверять этот контент каждый час:

 every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
   runner "Post.grab_feed"
 end

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

0 голосов
/ 18 февраля 2011

Вы должны поместить бизнес-логику в модель, а логин действия - в задачу rake, я считаю, что это обычная стратегия для автоматизированных задач. Ваш cron должен выглядеть так:

cd /path/to/web_app && RAILS_ENV=environment /usr/local/bin/rake namespace:task
0 голосов
/ 18 февраля 2011

Почему вы не хотите поместить это в контроллер? Наконец, это просто еще одно действие, управляемое автоматическим пользователем в данном случае (cron). Я выполняю запрос POST, который запускается каждый час, чтобы получить этот канал новостей и создать записи, если это необходимо.

...