Извините за открытие старой нити, но так как это 2011, и я до сих пор не мог найти правильный валидатор, я создал один себя:
class UniqueSetValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
setup record
record.errors[attribute] << "- collection of fields [" + @fields + "] is not unique" if record.class.count(:conditions => @conditions) > 0
end
def check_validity!
raise ArgumentError, "Must contain an array of field names' symbols" unless options[:in] && options[:in].respond_to?(:each)
end
private
def setup record
conditions = []
fields = []
options[:in].each do |field|
conditions |= [ field.to_s + " = '" + record[field].to_s + "'" ]
fields |= [ field.to_s ]
end
@conditions = conditions.join(" AND ")
@fields = fields.join(", ")
end
end
Это похоже на работу для меня. Для того, чтобы использовать его вставить код в:
your_rails_app/lib/unique_set_validator.rb
и включить его в:
your_rails_app/config/application.rb
, добавив следующую строку:
config.autoload_paths += %W(#{config.root}/lib )
Тогда вы можете просто использовать его в вашей модели:
validates :field, :unique_set => [ :field, :field2 ]
Он будет проверять уникальные ness of pair [: field,: field2], и любая ошибка будет возвращена в поле. Я не пробовал, но он должен работать для большего количества двух полей.
Надеюсь, что я ничего не испортил, и это поможет кому-то. :)
Это то, что у него уже есть. – ryeguy
В модели регистрации есть 'id', а не' enrollment_id', и он всегда уникален. – Voldy
@ Вольди, да, я не правильно прочитал вопрос. Ты прав. –