2017-01-15 2 views
0

Это в моем инициализаторе, который отлично работает для вытягивания всех самых низких цен и средневзвешенной цены каждые 5, 10, 20 и т. Д. . секундЯ пытаюсь использовать rufus, планируя gem от контроллера, чтобы вытащить самую низкую цену с api каждый мин.

unless defined?(Rails::Console) || File.split($0).last == 'rake' 
s = Rufus::Scheduler.singleton 
s.every '10m' do 
    Rails.logger.info "hello, it's {Time.now}" 
    Rails.logger.flush 
    Bid.all.each do |bid| 
    id = bid.event_id 
    @events = Unirest.get("https://api.seatgeek.com/2/events/#{id}?&client_id=NjQwNTEzMXwxNDgxNDkxODI1").body 
    if @events["stats"] 
     @low = @events["stats"]["lowest_price"] || 0 
     @avg = @events["stats"]["average_price"] || 0 
     BuyNowBid.create(bid_id: bid.id, lowest_price: @low , average_price: @avg) 
    end 
    end 
end 
end 

Но когда я пытаюсь создать предложение от контроллера, а затем попытаться вытащить нижнюю и среднюю цену от API он не работает уже сидели работали над этим в течение нескольких часов в настоящее время каких-либо советы было бы высоко оценено.

def create 
#@bid? 
#seatgeek id 
@bidd = Bid.new(event_id: params[:event_id], user_id: session[:user_id], bid: params[:bid], lowest_price: params[:lowest_price])  
if session[:user_id] == current_user.id 
    @bidd.save 
    @events = Unirest.get("https://api.seatgeek.com/2/events/#{@bidd.event_id}?&client_id=NjQwNTEzMXwxNDgxNDkxODI1").body 
    if @events["stats"] 
    @low = @events["stats"]["lowest_price"] || 0 
    @avg = @events["stats"]["average_price"] || 0 
    BuyNowBid.create(bid_id: @bidd.id, lowest_price: @low , average_price: @avg) 
    end 

    Rufus::Scheduler.singleton.every '10s' do 
    @events = Unirest.get("https://api.seatgeek.com/2/events/#{@bidd.event_id}?&client_id=NjQwNTEzMXwxNDgxNDkxODI1").body 
    if @events["stats"] 
     @low = @events["stats"]["lowest_price"] || 0 
     @avg = @events["stats"]["average_price"] || 0 
     BuyNowBid.create(bid_id: @bidd.id, lowest_price: @low , average_price: @avg) 
    end 
    end 
    flash[:success] = "bid created." 
    redirect_to "https://stackoverflow.com/users/#{current_user.id}" 
else 
    flash[:warning] = 'please sign in' 
    redirect_to '/login' 
end 
end 
+0

Возможно, вместо этого вы можете создать метод обновления в моей модели? –

+0

какая ошибка вы получаете ..? – Milind

+0

thats вещь, я не получаю ошибку, ее просто не запускает планировщик, но когда я делаю это из инициализатора, он делает –

ответ

0

Я выяснил, как это сделать, прочитав дополнительную документацию rufus и подолгу переделав ее. Мне удалось создать метод, который обращался к планировщику rufus в моем инициализаторе.

def restart_jobs 
puts 'Stopping rufus' 
Rufus::Scheduler.singleton.jobs(:tag => 'main_process').each do |job| 
Rufus::Scheduler.singleton.unschedule(job) 
end 
puts 'Starting rufus' 
load "#{Rails.root}/config/initializers/scheduler.rb" 

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

def create 
@bidd = Bid.new(event_id: params[:event_id], user_id: session[:user_id], bid: params[:bid], lowest_price: params[:lowest_price])  
if session[:user_id] == current_user.id 
    @bidd.save 
    send_message("+13125501444", "test") 
    restart_jobs 
    flash[:success] = "bid created." 
    redirect_to "https://stackoverflow.com/users/#{current_user.id}" 
else 
    flash[:warning] = 'please sign in' 
    redirect_to '/login' 
end 
end 

только часть я изменил в планировщике в intializer добавляет хэш

:tag => 'main_process' 

и здесь в планировщике

unless defined?(Rails::Console) || File.split($0).last == 'rake' 
s = Rufus::Scheduler.singleton 
s.every '1m', :tag => 'main_process' do 
    Rails.logger.info "hello, it's #{Time.now}" 
    Rails.logger.flush