1

ユーザーが互いに賭けることができるアプリがあり、結果がアプリに読み込まれると、Rake タスクを使用して賭けを解決します。私は Heroku で実行しているので、この Rake タスクに 30 分ごとにスケジュール サービスを使用しています。

これは問題なく動作しますが、結果がデータベースに保存/更新されるときに Rake ジョブを実行したいです。

Rake タスクを変換して、モデルから実行できるようにするにはどうすればよいですか。以下のようになります。また、決済プロセスが必要な状況がいくつかある可能性があるため、コントローラーから実行できると便利です。

class Spotprice < ActiveRecord::Base
  belongs_to :spotarea
  belongs_to :product

  after_save   :settlement
end

私の Rake タスクは現在次のようになっています。

task :settlement => :environment do
  puts "Settlement in progress..."
  puts "-------------------------"
  puts " "
  puts " "
  puts "BETS:"
  puts "-------------------------"

  # Bet settlement
  @bets = Bet.where(:settled => false)

  @bets.find_each do |bet|

    if not bet.choice.spotprice.nil?

      case 
      when bet.choice.spotprice.value > bet.choice.value && bet.buy == true
        profitloss  = 10
        puts "#{bet.id}: Win (1)"
      when bet.choice.spotprice.value < bet.choice.value && bet.buy == false 
        profitloss  = 10
        puts "#{bet.id}: Win (2)"
      when bet.choice.spotprice.value > bet.choice.value && bet.buy == false
        profitloss  = -10
        puts "#{bet.id}: Loose (3)"
      when bet.choice.spotprice.value < bet.choice.value && bet.buy == true 
        profitloss  = -10
        puts "#{bet.id}: Loose (4)"
      when bet.choice.spotprice.value == bet.choice.value
        profitloss  = -10
        puts "#{bet.id}: Loose (5)"
      end

      if profitloss  
        bet.settled    = true
        bet.profitloss = profitloss 
        bet.save
      end 

    end

    if bet.choice.settled == true
      bet.choice.settled = false
      bet.choice.save
    end

  end

  # Pusher update
  Pusher["actives"].trigger("updated", {:message => "Settlement completed"}.to_json)

end
4

2 に答える 2

1

元の質問からの私のコメントを答えに入れるだけです。

同様の状況で、レーキの外部から呼び出したいレーキタスクがありました。あなたがしたいのは、コードをrakeタスクからrubyクラスに移動することです。これに最適な場所は、libです。クラスは次のようになります。

# lib/settlement.rb
class Settlement
  def self.settle_bets
    # all the code that used to be in the rake task
  end
end

次に、コードで次のようなことを行うことができます(ランダムな例):

# app/controllers/bets_controller.rb
#...
  def settle_bets
    require "settlement"
    Settlement.settle_bets
  end
# ...

または(別のランダムな例):

# app/models/bet.rb
class Bet ...
  after_update: update_some_bets

  # ... more code here

  private
    def update_some_bets
      require "settlement"
      Settlement.settle_bets
    end

また、必要に応じて、引き続きrakeタスクを使用できます。

# lib/tasks/settlement.task
require "settlement"
# require "#{Rails.root}/lib/settlement.rb" # use this if the above won't work

task :settlement => :environment do
  Settlement.settle_bets
end
于 2012-11-20T19:40:21.010 に答える