Доступ к атрибутам модели в задаче rake

Мне было интересно, как получить доступ к атрибутам 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

person Richlewis    schedule 13.05.2013    source источник
comment
Вы можете получить доступ к своим моделям из своей задачи rake, но то, что вы пытаетесь сделать в методе points_total, — это доступ к двум экземплярам (прогноз и результат, а не прогноз и результат); вы должны вызвать метод points_total с этими двумя экземплярами: points_total my_prediction, my_result   -  person Galen    schedule 13.05.2013
comment
Привет, Гален, хорошо, во-первых, мне нужно использовать Result вместо результата, а во-вторых, вызвать метод с этими двумя экземплярами? я не уверен, что понимаю, не могли бы вы уточнить, пожалуйста, я изменил ошибки экземпляров   -  person Richlewis    schedule 13.05.2013
comment
Извините, я не очень хорошо понимаю, почему вы используете методы класса. Не могли бы вы поделиться кодом модели?   -  person Galen    schedule 13.05.2013
comment
привет, я обновил свои модели ..   -  person Richlewis    schedule 13.05.2013
comment
Скажите, пожалуйста, как вы запускаете задачу?   -  person AnkitG    schedule 13.05.2013
comment
в консоли я запускаю %x[рейк граб: баллы], я использую консоль, чтобы посмотреть, что происходит   -  person Richlewis    schedule 13.05.2013
comment
@Richlewis У меня есть ответ, пожалуйста, проверьте   -  person Galen    schedule 13.05.2013


Ответы (1)


Проблема в том, что это задача грабли, а не в самих методах.

Обе модели Prodiction и Result имеют метод home_score, но это методы экземпляра, а не методы класса, поскольку вы пытаетесь использовать их в своих методах points_total и allocate_points.

Разница между классом и методом экземпляра заключается в объекте, в котором вызывается метод:

  • Метод класса: вызывается на самой модели, как в User.new. Метод new вызывается для модели User для создания нового экземпляра модели.
  • Метод экземпляра: вызывается для конкретного экземпляра модели, как в my_user.name = "Terminator". Метод name вызывается у конкретного my_user пользователя для изменения его (и только его) имени.

Глядя на ваш код, ваши методы home_score считаются применяемыми к конкретным экземплярам прогнозов и результатов, поскольку они являются методами экземпляров. Это ошибка, которую выдает консоль, методы недоступны для класса (модели).

Предполагая, что ваша задача рейка пытается обновить общее количество очков каждого прогноза в вашей базе данных, код будет таким:

библиотека/задачи/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, которая также должна быть отражена в моделях; но поскольку я не знаю точно всей картины для вашего приложения, я не хотел это менять, просто сосредоточившись на методах грабли.

Надеюсь, это поможет,

person Galen    schedule 13.05.2013
comment
Спасибо за очень подробный ответ, я прочитаю несколько раз, чтобы понять, что касается самой задачи rake, я получаю дублированный аргумент def points_total (прогноз, прогноз. результат) ... в отношении отношений прогноз имеет_один результат с предсказанием_id как FK в модели результата - person Richlewis; 13.05.2013
comment
Да, относительно отношения has_one я предположил в ответе. Что касается ошибки, не уверен, что понял; метод points_total вызывается с двумя разными параметрами: предсказание (экземпляр Prediction) и его результат (prediction.result, экземпляр Result), это разные объекты. Не могли бы вы указать точную ошибку? - person Galen; 13.05.2013
comment
scoring_system_logic/lib/tasks/retrieve_score.rake:10: повторяющееся имя аргумента. или '\n' определение прогноза_общего количества очков, прогнозирование.результат ^ C:/Sites/scoring_system_logic/lib/tasks/retrieve_score.rake:18: синтаксическая ошибка, неожиданное ключевое слово_end, ожидание $end scoring_system_logic/Rakefile:7:in `‹top ( требуется)›' (Просмотреть полную трассировку, запустив задачу с параметром --trace) =› - person Richlewis; 13.05.2013
comment
Извините @Richlewis, это была моя вина. Я отредактировал код в ответе, теперь он должен работать - person Galen; 13.05.2013
comment
не нужно извиняться, вы помогли мне вспомнить .... хорошо, поэтому, когда я запускаю задачу, я получаю ошибку undefined method `home_score' для nil: NilClass.. Однако я только что заметил, что мой результат не имеет в атрибутах Prediction_id, так что добавлю сейчас и посмотрим, будет ли разница - person Richlewis; 13.05.2013
comment
Не забудьте также определить ассоциацию has_one в моделях. - person Galen; 13.05.2013
comment
привет @galen, мне просто интересно, как это будет работать с отношением has_many, результат.home_score больше не верен, не так ли? я изменил свои отношения, и я получаю неопределенный результат метода для прогнозирования... любая помощь приветствуется - person Richlewis; 15.05.2013