Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merged pull request rails#306 from rsim/case_insensitive_uniqueness_v…
…alidation_fix.

Do not use SQL LIKE operator for case insensitive uniqueness validation
  • Loading branch information
tenderlove committed Apr 25, 2011
2 parents 242d24d + 070c998 commit 9336445
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
5 changes: 3 additions & 2 deletions activerecord/lib/active_record/validations/uniqueness.rb
Expand Up @@ -56,8 +56,9 @@ def build_relation(klass, table, attribute, value) #:nodoc:
column = klass.columns_hash[attribute.to_s]
value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s if column.text?

if !options[:case_sensitive] && column.text?
relation = table[attribute].matches(value)
if !options[:case_sensitive] && value && column.text?
# will use SQL LOWER function before comparison
relation = table[attribute].lower.eq(table.lower(value))
else
value = klass.connection.case_sensitive_modifier(value)
relation = table[attribute].eq(value)
Expand Down
26 changes: 26 additions & 0 deletions activerecord/test/cases/validations/uniqueness_validation_test.rb
Expand Up @@ -162,6 +162,32 @@ def test_validate_case_insensitive_uniqueness
end
end

def test_validate_case_sensitive_uniqueness_with_special_sql_like_chars
Topic.validates_uniqueness_of(:title, :case_sensitive => true)

t = Topic.new("title" => "I'm unique!")
assert t.save, "Should save t as unique"

t2 = Topic.new("title" => "I'm %")
assert t2.save, "Should save t2 as unique"

t3 = Topic.new("title" => "I'm uniqu_!")
assert t3.save, "Should save t3 as unique"
end

def test_validate_case_insensitive_uniqueness_with_special_sql_like_chars
Topic.validates_uniqueness_of(:title, :case_sensitive => false)

t = Topic.new("title" => "I'm unique!")
assert t.save, "Should save t as unique"

t2 = Topic.new("title" => "I'm %")
assert t2.save, "Should save t2 as unique"

t3 = Topic.new("title" => "I'm uniqu_!")
assert t3.save, "Should save t3 as unique"
end

def test_validate_case_sensitive_uniqueness
Topic.validates_uniqueness_of(:title, :case_sensitive => true, :allow_nil => true)

Expand Down

0 comments on commit 9336445

Please sign in to comment.