Извините за открытие старого потока, но так как это 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 ]
Он проверит уникальность пары [: field,: field2], и любая ошибка будет возвращена в: field. Я не пробовал, но это должно работать для более чем 2 полей.
Надеюсь, я ничего не напутал, и это кому-нибудь поможет. :)