Отправить параметр before_save - PullRequest
8 голосов
/ 11 ноября 2011

Я пытаюсь создать приложение «рельсовым способом», поэтому на этот раз вместо ретроспективной обработки записей в базе данных я пытаюсь сделать это с помощью метода before_save, а именно:

 def make_percentage_from(score)
   percent = (score.fdiv(20) * 100)
   return percent
 end

Каждый элемент, попадающий в базу данных, имеет оценку 20, прежде чем он будет сохранен в базе данных. Я хотел бы сохранить его в процентах, однако проблема в том, что я не могу отправить какие-либо атрибутные данные. через before_save.

В идеале я бы имел

before_save: make_percentage_from (оценка для подсчета)

Как я могу это сделать? Google не так уж и активен для меня, и я решил не обрабатывать эти данные после того, как они сохранены (если, конечно, - это другой способ!)

Спасибо и всего наилучшего

Geoff

Ответы [ 2 ]

10 голосов
/ 12 ноября 2011

Краткий ответ: обратные вызовы никогда не имеют параметров. Предполагается, что обратные вызовы действуют на объект или сами записи. Поэтому все, что вам понадобится в качестве параметра, вам нужно будет сохранить либо как атрибут (который сохраняется в базе данных), либо как переменную экземпляра.

9 голосов
/ 11 ноября 2011

Если score и percentage являются атрибутами Widget:

class Widget < ActiveRecord::Base
  before_validates :calculate_score_percentage
  validates :percentage, :presence => true
private
  def calculate_score_percentage
    self.percentage = score.fdiv(20) * 100
  end
end

Это работает, потому что все ваши атрибуты / столбцы имеют методы получения и установки, автоматически определяемые ActiveRecord. Ссылка на score в методе calculate_score_percentage фактически вызывает метод self.score, который возвращает объект / значение score. Мы должны использовать self.percentage явно, потому что было бы неоднозначно использовать только percent - это может быть либо определение локальной переменной percentage, либо вызов self.percentage=. По умолчанию будет первое, что в данном случае не то, что мы хотим.

Я использую before_validates, чтобы показать, что вы можете использовать проверку еще здесь, что хорошо для проверки работоспособности. Если вы не хотите выполнять какую-либо проверку, вы можете заменить ее на before_save без каких-либо изменений кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...