diff options
author | Yorick Peterse <yorickpeterse@gmail.com> | 2015-10-07 14:03:18 +0200 |
---|---|---|
committer | Yorick Peterse <yorickpeterse@gmail.com> | 2015-10-07 23:32:14 +0200 |
commit | 1190d0ab3dc7a3025bf55b666f34d1a0b51a8d89 (patch) | |
tree | dfe1780bda6e1d50e37485154bf1afa6a7f91d3e /app/models/concerns | |
parent | 85c6a3743abe5683c2317f1957a9f047ad2b4b8e (diff) | |
download | gitlab-ce-1190d0ab3dc7a3025bf55b666f34d1a0b51a8d89.tar.gz |
Added concern for case-insensitive WHERE queries
On PostgreSQL these queries use LOWER(...) to compare columns and
values. For MySQL a regular WHERE is performed as MySQL is already
case-insensitive.
Diffstat (limited to 'app/models/concerns')
-rw-r--r-- | app/models/concerns/case_sensitivity.rb | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/app/models/concerns/case_sensitivity.rb b/app/models/concerns/case_sensitivity.rb new file mode 100644 index 00000000000..49d350e092b --- /dev/null +++ b/app/models/concerns/case_sensitivity.rb @@ -0,0 +1,28 @@ +# Concern for querying columns with specific case sensitivity handling. +module CaseSensitivity + extend ActiveSupport::Concern + + module ClassMethods + # Queries the given columns regardless of the casing used. + # + # Unlike other ActiveRecord methods this method only operates on a Hash. + def case_insensitive_where(params) + criteria = self + cast_lower = Gitlab::Database.postgresql? + + params.each do |key, value| + column = ActiveRecord::Base.connection.quote_table_name(key) + + if cast_lower + condition = "LOWER(#{column}) = LOWER(:value)" + else + condition = "#{column} = :value" + end + + criteria = criteria.where(condition, value: value) + end + + criteria + end + end +end |