2015-11-24 3 views
1

У меня есть модель счета-фактуры с утверждением, имя_пользователя и тип state_type.валидация с использованием реальных названных областей рельсов

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

scope :approver, where(state_type: 3) 
scope :po_no, where(state_type: 2) 

validates :approver_note, :presence => true, uniqueness: { scope: [:ac_id, :approver]}, if: :state_three? 
validates :po_number, :presence => true, uniqueness: { scope: [:ac_id, :po_no]}, if: :state_two? 

def state_three? 
    self.state_type==3 
end 

def state_two? 
    self.state_type==2 
end 

Как я могу убедиться, что уникальность в approver_note валидатор запускается на выбранной области записей. Он должен проверять использование записей, имеющих state_type = 3.

мне нужно что-то в подобных строках этой ошибки ...

https://rails.lighthouseapp.com/projects/8994/tickets/4325-real-scope-support-for-activerecords-uniqueness-validation

Теперь Является ли это доступно в рельсах? или мы можем добиться этого с помощью пользовательской проверки?

+0

Почему бы не проверить его с Rspec? –

+0

@MaximPontyushenko Не могли бы вы рассказать подробнее? Я тебя не понял ... Извини. –

+0

Вы пробовали пользовательскую проверку? – charlysisto

ответ

1

Опция scopeuniquness проверяет, является ли комбинация из двух значений столбца uniq в таблице, честно говоря, я действительно не понимаю, как это было бы достаточно умно, чтобы применить динамическую область. Слишком много волшебства даже для рельсов!

Однако валидатор весьма прост:

validate :approver_note_scoped_uniqueness, if: :state_three? 

def approver_note_scoped_uniqueness 
    if self.class.approver.where(ac_id: ac_id).count > 0 
    errors.add(:ac_id, "My custom error message") 
    end 
end 

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Добавление к этому, я вижу, что выбор условий доступен в validate_uniqueness_of от Rails 4. Мы можем использовать это и построить две проверки для одного и для единственности. Только в случае, если кто-то ищет ответ в Rails 4.

В случае Rails 4,

validates_presence_of :approver_note, if: :state_three? 
validates_presence_of :po_number, if: :state_two? 
validates_uniqueness_of :approver_note, scope: [:ac_id], conditions: -> { where(state_type: 3)}, if: :state_three? 
validates_uniqueness_of :po_number, scope: [:ac_id], conditions: -> { where(state_type: 2)}, if: :state_two? 

def state_three? 
    self.state_type==3 
end 

def state_two? 
    self.state_type==2 
end 
+0

Yup, Это сработало, спасибо большое !!! –

Смежные вопросы