J'ai une application où les utilisateurs peuvent parier entre eux et lorsque les résultats sont chargés dans l'application, j'utilise une tâche Rake pour régler les paris. Je cours sur Heroku alors j'utilise leur service Schedule pour cette tâche Rake toutes les demi-heures.Exécuter Rake Tâche sans utiliser Rake
Cela fonctionne très bien, mais j'aimerais beaucoup exécuter le travail Rake lorsque les résultats sont enregistrés/mis à jour dans la base de données.
Comment puis-je convertir la tâche Rake afin que je puisse l'exécuter à partir de mon modèle, ce qui pourrait ressembler à ce qui suit. Cela pourrait aussi être bien si je pouvais l'exécuter depuis les contrôleurs, car je pourrais avoir plusieurs situations où un processus de règlement est nécessaire.
class Spotprice < ActiveRecord::Base
belongs_to :spotarea
belongs_to :product
after_save :settlement
end
Ma tâche Rake ressemble à ce moment:
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
Vous pouvez simplement le mettre dans un fichier dans 'lib' et l'appeler quand vous en aurez besoin. Vous pourriez faire des choses délicates comme mettre en place des observateurs pour voir quand les modèles sont sauvegardés, et réagir en conséquence. Vous pouvez également utiliser PrivatePub pour envoyer des méthodes asynchrones à votre vue, par exemple pour alerter les utilisateurs. – MrDanA
Salut .. J'ai juste l'impression que ce n'est pas la meilleure pratique pour exécuter Rake Tasks à partir de modèles, de contrôleurs etc .. qu'ils devraient seulement être appelés à partir d'une sorte de Cron. Ai-je eu la mauvaise impression :) – Twiddr
Oh désolé, je ne me suis pas très bien expliqué. C'était ma faute. Ce que je voulais dire, c'est que vous pouviez retirer le code de la tâche rake et le placer dans une classe dans 'lib'. Vous n'auriez plus de tâche de rake.Le code serait juste une méthode ruby régulière (loge juste dans 'lib' puisque ce n'est pas un modèle ou quoi que ce soit) et ensuite l'appelle depuis n'importe où. – MrDanA