2012-04-18 12 views
5

У меня есть модель счета-фактуры с approver_note, po_number и state_id.Rails 3 Validation with Scope Conditions

мне нужно валидация, чтобы проверить:

validates :approver_note, :presence => true, {:scope => state_id == 3} 
validates :po_number, :presence => true, {:scope => state_id ==2} 

Таким образом, если пользователь выбирает state_id = 3, он должен ввести ноту. Если он выбирает state_id = 2, он должен ввести po_number.

Любая помощь будет большой ... спасибо!

ответ

7

Вы ищете опцию :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».

+0

+1 отличная деталь и варианты. –

+0

Отлично, спасибо! Я использовал ваш второй вариант, так как мне тоже не нравятся лямбды. Однако, хотя я получаю правильные сообщения об ошибках проверки, запись по-прежнему обновляется. Другими словами, когда пользователь выбирает Approve (state_id = 2), не вводя po_number, я получаю сообщение об ошибке, но запись по-прежнему обновляется до invoice.state_id = 2 ... ?? –

+0

Хм, это звучит как отдельная проблема, возможно, в вашем контроллере. Если проверка не выполнена, ActiveRecord не будет сохранен. Возможно, вы захотите опубликовать это как еще один вопрос и включить действие вашего контроллера. –