Как проверить наличие поля, только если другое поле было отредактировано в рельсах? - PullRequest
5 голосов
/ 18 января 2010

У меня есть таблица со столбцом с именем lifecycle_id, а другая с именем lifecycle_change_reason. lifeycle_id обычно автоматически изменяется системой на основе других факторов, но некоторые пользователи имеют возможность изменить жизненный цикл вручную. если они это сделают, я бы хотел, чтобы они указали причину изменения, но я не хочу требовать этого поля в любое другое время. у кого-нибудь есть предложения о том, как я могу выполнить этот тип проверки?

thx:)

-C

Ответы [ 2 ]

0 голосов
/ 20 января 2010

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

if params[:object_name][:life_cycle_id] != @object.life_cycle_id && params[:object_name][:life_cycle_change_reason].blank?
   flash[:error] = "You must enter a reason for changing the life cycle."
   redirect_to :back and return false # or whatever
end
0 голосов
/ 18 января 2010

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

class Member < ActiveRecord::Base
  belongs_to :lifecycle

  validates :lifecycle_change_reason, :if => :lifecycle_changed?

  before_save :reset_original_lifecycle

  protected

  def lifecycle_changed?
    self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil?
  end

  def reset_original_lifecycle
    self.lifecycle_id_original = self.lifecycle_id
  end
end

Когда объект (член в этом примере) проверен, lifecycle_change_reason потребуется только тогда, когда оригинал и lifecycle_id не идентичны. Нулевое значение также допускается для оригинала, потому что это будет то, что будет, когда запись создается заново.

Затем при сохранении «оригинал» устанавливается равным lifecycle_id, поэтому следующий цикл обновления будет работать правильно.

Это не так чисто, как хотелось бы. Моей первой мыслью было использование attr_accessor, чтобы дубликат не сохранялся в БД все время, но это означало бы установку этого значения при каждой загрузке записи. Мне не известны какие-либо обратные вызовы в стиле on_load для моделей ActiveRecord.

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