Как запустить ActiveJob только один раз в Ruby on Rails? - PullRequest
0 голосов
/ 12 ноября 2018

Я использую подписки и планы в своем приложении вместе с Stripe.Сущность «Мой план» содержит много «визуальных» данных о модели и связана с платежным шлюзом, совместно использующим идентификатор.

У меня уже есть миграция, которая генерирует мои базовые данные плана.Например:

class CreateBasicPlanData < ActiveRecord::Migration[5.1]
  def change
    Plan.create(name:'Hobby', 
    visibility: 'Low Visibility',
    card_description:'Free portfolio listing good for beginners.',
    features_description:'<ul><li>5 Portfolio Images</li><li>Messaging to other Talent</li><li>Basic Search Ranking</li></ul>',
    price: 0,
    css:'plan-hobby',
    number_albums: 1,
    number_photos_per_album: 5,
    payment_gateway_plan_identifier: 'hobby'
    )

    Plan.create(name:'Professional', card_description:'Solid portfolio for those wanting more exposure and booking opportunities.',
    visibility: 'High Visibility',
    features_description:'<strong>Everything included in Hobby <em>PLUS:</em></strong><ul><li>25 Portfolio Images</li><li>Intermediate Search Ranking</li><li>Multi-state portfolio listing</li></ul>',
    price: 4.99,
    css:'plan-professional',
    number_albums: 5,
    number_photos_per_album: 25,
    payment_gateway_plan_identifier: 'professional'
    )

Я хочу создать задание, которое, когда система будет в порядке, получит все данные из моей локальной базы данных и создаст планы Stripe.Мой код выглядит примерно так:

class SyncLocalPlansWithStripe < ActiveJob::Base
def perform
    plans = Plan.all
    #delete all the plans on stripe
     Plan.transaction do
      begin 
        puts 'Start deleting'
        Stripe::Plan.list.each do |plan_to_delete|
          plan_to_delete.delete
        end
        puts 'End deleting'
      end
    end
    Plan.transaction do
      begin 
        plans.each do |plan| 
          PaymentGateway::CreatePlanService.new(plan).run 
        end
      rescue PaymentGateway::CreatePlanServiceError => e
        puts "Error message: #{e.message}"
        puts "Exception message: #{e.exception_message}"
      end
    end
  end

У меня вопрос.Как я могу запустить эту работу, если я хочу, только один раз, из консоли?

Что-то вроде граблей: задание выполнено sync_local_plans_with_stripe

1 Ответ

0 голосов
/ 13 ноября 2018

Я думаю, что вы путаете грабли с ActiveJob.

Если вы хотите запустить задание из rails console, вы можете просто выполнить SyncLocalPlansWithStripe.perform_now. Смотри https://guides.rubyonrails.org/active_job_basics.html#enqueue-the-job

Как предлагается в комментариях, вы также можете запустить задание прямо из командной строки с помощью Rails runner: rails runner "SyncLocalPlansWithStripe.perform_now"

Или, если вы предпочитаете выполнять это как рейк-задание, вам нужно создать его вместо этого. Смотри https://guides.rubyonrails.org/command_line.html#custom-rake-tasks

...