我想知道如何访问一个Models属性,然后使用一些方法在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
答案 0 :(得分:2)
问题在于是一个rake任务,但是因为方法本身。
预测和结果模型都有一个home_score
方法,但它们是实例方法而不是类方法,因为您尝试在它们中使用它们points_total
和allocate_points
方法。
类和实例方法之间的区别在于调用方法的对象:
User.new
中所示。在new
模型上调用User
方法以生成模型的新实例。my_user.name = "Terminator"
中所述。在特定的name
用户上调用my_user
方法来更改其名称(及其名称)。查看您的代码,您的方法home_score被认为应用于特定的预测和结果实例,因为它们是实例方法。这是控制台抛出的错误,这些方法不适用于Class(模型)。
假设您的rake任务正在尝试更新数据库中每个预测的总分,那么代码将是:
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关联,它也可以反映在模型中;但由于我不确切知道你的应用程序的全貌,我不想改变这一点,只关注rake方法。
希望有所帮助,