Вы ищете опцию :if
вместо :scope
.
validates :approver_note, :presence => true,
:if => lambda { |invoice| invoice.state_id == 3 }
Но поскольку лямбда немного некрасиво, я бы, вероятно, добавить метод инкапсуляции, что вы делаете немного лучше:
validates :approver_note, :presence => true, :if => :requires_note?
validates :po_number, :presence => true, :if => requires_po_number?
def requires_note?
state_id == 3
end
def requires_po_number?
state_id == 2
end
Если вы на самом деле есть куча различных атрибутов которые необходимы, когда state_id
является 3, а не просто примечание, то вы можете что-то вроде этого:
validates :approver_note, :presence => true, :if => :green_state?
validates :po_number, :presence => true, :if => orange_state?
def green_state?
state_id == 3
end
def orange_state?
state_id == 2
end
(Replace «зеленый» с - я не знаю - «high_documentation» или что-то имеет смысл в вашем мире)
Или, может быть, вы хотите, чтобы позволить государству решить, что это:.
def green_state?
state.green?
end
Это действительно помогает сделать терминологию в программном коде прилипает более близко к вашему реальному миру языка, в отличие от «3» и «2».
+1 отличная деталь и варианты. –
Отлично, спасибо! Я использовал ваш второй вариант, так как мне тоже не нравятся лямбды. Однако, хотя я получаю правильные сообщения об ошибках проверки, запись по-прежнему обновляется. Другими словами, когда пользователь выбирает Approve (state_id = 2), не вводя po_number, я получаю сообщение об ошибке, но запись по-прежнему обновляется до invoice.state_id = 2 ... ?? –
Хм, это звучит как отдельная проблема, возможно, в вашем контроллере. Если проверка не выполнена, ActiveRecord не будет сохранен. Возможно, вы захотите опубликовать это как еще один вопрос и включить действие вашего контроллера. –