访问rake任务中的模型属性

时间:2013-05-13 11:05:24

标签: ruby-on-rails ruby ruby-on-rails-3 methods rake-task

我想知道如何访问一个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

1 个答案:

答案 0 :(得分:2)

问题在于是一个rake任务,但是因为方法本身。

预测结果模型都有一个home_score方法,但它们是实例方法而不是类方法,因为您尝试在它们中使用它们points_totalallocate_points方法。

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

  • 类方法:在模型本身上调用,如User.new中所示。在new模型上调用User方法以生成模型的新实例。
  • 实例方法:对模型的特定实例进行callen,如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方法。

希望有所帮助,