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

问题是因为是一个简单的任务,而是因为方法本身。

您的PredictionResult模型都有一个home_score方法,但它们是实例方法而不是类方法,因为您试图在您的points_totalandallocate_points方法中使用它们。

类和实例方法的区别在于调用方法的对象:

  • 类方法:在模型本身上调用,如User.new. new在模型上调用该方法User以生成模型的新实例。
  • 实例方法:在模型的特定实例上调用,如my_user.name = "Terminator". name在特定用户上调用该方法my_user以更改其(并且只是其)名称。

查看您的代码,您的方法 home_score 被认为适用于预测和结果的特定实例,因为它们是实例方法。这是控制台抛出的错误,方法不适用于类(模型)。

假设您的 rake 任务正在尝试更新数据库中每个预测的总点数,代码将是:

lib/tasks/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 关联,这也应该反映在模型中;但由于我不完全了解您的应用程序的整体情况,所以我不想改变这一点,只关注 rake 方法。

希望有帮助,

于 2013-05-13T13:30:46.963 回答