ユーザーが互いに賭けることができるアプリがあり、結果がアプリに読み込まれると、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