Module: ActiveRecord::Validations::ClassMethods

Defined in:
lib/m_active_record_validations.rb

Instance Method Summary collapse

Instance Method Details

#validates_uniqueness_case_insensitiveObject



3
# File 'lib/m_active_record_validations.rb', line 3

alias_method :validates_uniqueness_case_insensitive, :validates_uniqueness_of

#validates_uniqueness_of(*attr_names) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/m_active_record_validations.rb', line 5

def validates_uniqueness_of(*attr_names)
  configuration = { :message => ActiveRecord::Errors.default_error_messages[:taken], :case_sensitive => false } 
  configuration.update(attr_names.pop) if attr_names.last.is_a?(Hash)
  validates_each(attr_names,configuration) do |record, attr_name, value|
    if value.nil? || !columns_hash[attr_name.to_s].text? || configuration[:case_sensitive] == true
      condition_sql = "#{attr_name} #{attribute_condition(value)}" 
      condition_params = [value]
    else
      condition_sql = "LOWER(#{attr_name}) #{attribute_condition(value)}" 
      condition_params = [value.downcase]
    end
    if scope = configuration[:scope]
      Array(scope).map do |scope_item|
        scope_value = record.send(scope_item)
        condition_sql << " AND #{record.class.table_name}.#{scope_item} #{attribute_condition(scope_value)}"
        condition_params << scope_value
      end
    end    
    unless record.new_record?
      condition_sql << " AND #{record.class.table_name}.#{record.class.primary_key} <> ?"
      condition_params << record.send(:id)  
    end
    if record.class.respond_to? :find_with_deleted # if true it uses acts_as_paranoid deleted_at is null or status_id is deleted in search
      rec = record.class.count_with_deleted(:conditions => [condition_sql, *condition_params])
    else
      rec = record.class.count(:conditions => [condition_sql, *condition_params])
    end
    if rec != 0 # when a record is found, 
      record.errors.add(attr_name, configuration[:message])
    end
  end # validates_each
end