Есть несколько способов сделать это.Я бы, наверное, пошел с чем-то вроде этого:
validates_uniqueness_of :wallport_id, :allow_nil => true, :unless Proc.new { |u| u.wallport_id == 'p' or u.wallport_id == 'd' }
Вы также можете разбить дополнительную логику на собственный метод, например:
validates_uniqueness_of :wallport_id, :unless :has_nonunique_wallport_id
NONUNIQUE_WALLPORT_IDS = ['p', 'd', nil]
def has_nonunique_wallport_id
NONUNIQUE_WALLPORT_IDS.include? wallport_id
end
или протолкнуть всю проверкув своем собственном методе, например:
validate :has_valid_wallport_id
def has_valid_wallport_id
# check wallport id and return either true or false
end
Наилучший подход, вероятно, зависит от того, какой из них вы считаете наиболее читаемым, какую функциональность вы можете использовать для других частей вашего кода (например, кому-то еще нужно)узнать о действительных неуникальных идентификаторах wallport?), и какие вещи вы ожидаете изменить (например, вы добавите больше действительных неуникальных идентификаторов позже?).Есть также несколько различных способов сделать фактическую проверку, которая снова сводится к тому, что вы считаете наиболее читабельным и как, по вашему мнению, может развиваться система.