0

モデルの属性にアクセスし、いくつかのメソッドを使用してrakeタスクで実行する方法を考えていました.読んだものから、タスクの外部でメソッドを宣言する必要がありますが、モデルにアクセスするとスローされます.

これ入れたら分かる

namespace :grab do
 task :scores => :environment do
  puts User.all.inspect
 end
end

次に、すべてのユーザーを印刷します

以下は私が達成しようとしているものです

レイクタスク

namespace :grab do
 task :scores => :environment do
  points_total
  allocate_points
 end
end

def points_total
 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.update_attributes!(score: points_total)

 end

したがって、これらのメソッドを実行するには、予測モデルと結果モデルにアクセスする必要があります...

どんな助けでも大歓迎

ありがとう

編集

上記のようにタスクを実行すると、次のエラーが表示されます

 rake aborted!
 undefined method `home_score' for #<Class:0x4b651c0>

また、ここで更新するのは私のモデルです

class Prediction < ActiveRecord::Base
  attr_accessible :away_score, :away_team, :fixture_id, :home_score, :home_team, :score

  has_one :fixture
end

class Result < ActiveRecord::Base
  attr_accessible :away_score, :away_team, :fixture_date, :home_score, :home_team
end
4

1 に答える 1

2

問題はレーキ タスクであるためですが、メソッド自体が原因です。

PredictionモデルとResultモデルの両方にメソッドがありますが、これらはインスタンス メソッドであり、メソッドとhome_scoreメソッドで使用しようとしているクラス メソッドではありません。points_totalallocate_points

クラスとインスタンス メソッドの違いは、メソッドが呼び出されるオブジェクトです。

  • クラス メソッド: のように、モデル自体で呼び出されUser.newます。newモデルでメソッドが呼び出され、Userモデルの新しいインスタンスが生成されます。
  • インスタンス メソッド: のように、モデルの特定のインスタンスで呼び出されますmy_user.name = "Terminator"。このnameメソッドは、特定のmy_userUser で呼び出され、その名前 (およびその名前のみ) を変更します。

コードを見ると、メソッド home_score は、インスタンス メソッドであるため、予測と結果の特定のインスタンスに適用されると考えられます。これは、コンソールがスローしているエラーです。メソッドはクラス (モデル) で使用できません。

rake タスクがデータベース内の各 Prediction の合計ポイントを更新しようとしていると仮定すると、コードは次のようになります。

lib/タスク/grab.rake

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

ただし、points_total メソッドのように使用するには、予測モデルと結果モデルの間に何らかの関係が存在する必要があるため、これは一種の「疑似コード」です。私のコードは、モデルにも反映されるはずの has_one 関連付けを想定しています。しかし、あなたのアプリの全体像を正確に把握していないので、これを変更したくありませんでした。レーキ メソッドだけに注目しました。

それが役立つことを願って、

于 2013-05-13T13:30:46.963 に答える