пропустить validation_uniqueness для определенных значений - PullRequest
1 голос
/ 21 сентября 2011

У меня есть проверка на уникальность, и я хочу пропустить определенное значение или значения (например, 0000):

validates_uniqueness_of :gtin, :scope => [:user_id, :item_id]

Я пытался использовать следующую конструкцию, но она не работает:

validates_uniqueness_of :gtin, :scope => [:user_id, :item_id], :unless => Proc.new{|base_item| base_item.gtin == '0000'}

Как я могу пропустить определенное значение или значения? Спасибо.

P.S. Обновить!!! не видел ручную миграцию, которая меняет поведение

Ответы [ 3 ]

0 голосов
/ 21 сентября 2011

Не уверен, что это гоча или нет.Является ли значение gtin строкой или целым числом?Похоже, что ваши действия должны работать, но если это целое число, вы бы хотели изменить на:

validates :gtin, :uniqueness => {:scope => [:user_id, :item_id]}, :unless => Proc.new{|base_item| base_item.gtin == 0000}
0 голосов
/ 24 июля 2012

Я пытаюсь сделать то же самое, и я думаю, что знаю, что не так. Проблема в том, что объект if или instance «base_item» ссылается на значение, для которого вы проверяете уникальность, а не на объект предполагаемого соответствия.

Возможно, вы действительно хотите проверить проверяемый элемент (в этом случае я лаю не на том дереве), но в случае уникальности более естественным является желание исключить определенные совпадения. Например, у меня есть поле is_deleted, и я хочу разрешить нарушение уникальности, если соответствующий объект был удален.

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

validate :full_validation
def full_validation
  matches = self.class.find_all_by_name(self.name).select {|match| match.id != self.id && match.is_deleted==false}
  return (matches.size>0)
end
0 голосов
/ 21 сентября 2011

использование опции :unless, безусловно, правильный путь, но я думаю, что вы получаете весь объект в качестве аргумента proc, поэтому он должен быть

validates_uniqueness_of :gtin, :scope => [:user_id, :item_id], :unless => Proc.new{|obj| obj.gtin == '0000'}
...