# This was used to allow ActiveRecord classes using Single Table Inheritance # to be considered unique across types. We had a users table with a type field, # and noticed 'Administrator' had values that clashed with 'User'. # module ActiveRecord module Validations module ClassMethods def validates_uniqueness_of(*attr_names) configuration = { :message => ActiveRecord::Errors.default_error_messages[:taken], :scope_to_base => false } configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash) validates_each(attr_names,configuration) do |record, attr_name, value| condition_sql = "#{attr_name} #{attribute_condition(value)}" condition_params = [value] if scope = configuration[:scope] Array(scope).map do |scope_item| scope_value = record.send(scope_item) condition_sql << " AND #{scope_item} #{attribute_condition(scope_value)}" condition_params << scope_value end end unless record.new_record? condition_sql << " AND #{record.class.primary_key} <> ?" condition_params << record.send(:id) end find_with_class = (:scope_to_base) ? class_name_of_active_record_descendant(record.class).constantize : record.class if find_with_class.find(:first, :conditions => [condition_sql, *condition_params]) record.errors.add(attr_name, configuration[:message]) end end end end end end