0

予測と結果を比較するときにスコアを割り当てるレーキ タスクがあります。現時点では、予測 has_one :result のように関係が has_one です。

これを予測 has_many :results に変更したいと思います。私のタスクは次のようになります

namespace :grab do
 task :scores => :environment do
  Prediction.all.each do |prediction|
   score = points_total prediction, prediction.result
   allocate_points prediction, score
  end
 end
end

def points_total(prediction, result)
  wrong_predictions = [prediction.home_score - result.home_score, prediction.away_score - result.away_score]
  wrong_predictions = wrong_predictions.reject { |i| i == 0 }.size # returns 0, 1 or 2
   case wrong_predictions
    when 0 then 3
    when 1 then 1
    else 0
  end
 end

 def allocate_points(prediction, score)
  prediction.update_attributes!(score: score)
end

タスクを実行している瞬間にエラーが発生します

undefined method result for Prediction Class

したがって、 has_many 関係を使用すると、次の方法で結果属性にアクセスできます

prediction.result.home_score

それとも私はどこかで混乱していますか?新しい関係に合わせてレーキ タスクをリファクタリングする方法がわからない

アドバイスをいただければ幸いです

編集

@andrunix から以下のアドバイスを受け取った後でも、レーキ タスクに適用する方法を理解できないようです。

namespace :grab do
 task :scores => :environment do
  Prediction.all.each do |prediction|
   score = points_total prediction
   allocate_points prediction, score
  end
 end
end

def points_total prediction
 prediction.results.each do |result|
  result_h = result.home_score
  result_a = result.away_score
  wrong_predictions = [prediction.home_score - result_h, prediction.away_score - result_a]
  wrong_predictions = wrong_predictions.reject { |i| i == 0 }.size # returns 0, 1 or 2
  case wrong_predictions
  when 0 then 3
  when 1 then 1
  else 0
  end
 end
end

 def allocate_points prediction, score
  prediction.update_attributes!(score: score)
 end
4

1 に答える 1

1

予測結果が :has_many の場合、結果はコレクションになり、そのように扱う必要があります。あなたは言うことができません、

prediction.result.home_score

次のような配列インデックスで結果を参照する必要があります。

prediction.results[0].home_score

または、次のような結果のコレクションを反復処理します。

prediction.results.each do |result|
    result.home_score # do something with the score
end

これは「リファクタリングの方法」の質問に完全には答えていないことを認識していますが、Prediction :has_many の結果が得られた場合、prediction.result を単純に参照することはできなくなります。

それが役立つことを願っています。

于 2013-05-15T12:42:39.977 に答える