Skip to content

Commit

Permalink
Implement case-insensitive uniqueness validation
Browse files Browse the repository at this point in the history
  • Loading branch information
shioyama committed May 29, 2018
1 parent b5800df commit 1500871
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 47 deletions.
13 changes: 7 additions & 6 deletions lib/mobility/active_record/uniqueness_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,11 @@ def validate_each(record, attribute, value)
klass = record.class

if (([*options[:scope]] + [attribute]).map(&:to_s) & klass.mobility_attributes).present?
warn %{
WARNING: The Mobility uniqueness validator for translated attributes does not
support case-insensitive validation. This option will be ignored for: #{attribute}
} if options[:case_sensitive] == false
return unless value.present?
relation = klass.send(Mobility.query_method).where(attribute => value)
relation = klass.send(Mobility.query_method) do |m|
node = m.__send__(attribute)
options[:case_sensitive] == false ? node.lower.eq(value.downcase) : node.eq(value)
end
relation = relation.where.not(klass.primary_key => record.id) if record.persisted?
relation = mobility_scope_relation(record, relation)
relation = relation.merge(options[:conditions]) if options[:conditions]
Expand All @@ -51,7 +50,9 @@ def validate_each(record, attribute, value)

def mobility_scope_relation(record, relation)
[*options[:scope]].inject(relation) do |scoped_relation, scope_item|
scoped_relation.where(scope_item => record.send(scope_item))
scoped_relation.send(Mobility.query_method) do |m|
m.__send__(scope_item).eq(record.send(scope_item))
end
end
end
end
Expand Down
41 changes: 0 additions & 41 deletions spec/mobility/active_record_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,45 +15,4 @@ def translated_attribute_names; end
expect(Article.new.translated_attribute_names).to eq(["foo"])
end
end

describe "uniqueness validation" do
before do
opts = uniqueness_opts
Article.class_eval do
extend Mobility
translates :title, backend: :null
validates :title, uniqueness: opts
end
end
let(:article) do
Article.new
end

context "case_sensitive = false" do
let(:uniqueness_opts) { { case_sensitive: false } }

it "ignores option and emits warning" do
expect { expect(article.valid?).to eq(true) }.to output(
/#{%{
WARNING: The Mobility uniqueness validator for translated attributes does not
support case-insensitive validation. This option will be ignored for: title}}/).to_stderr
end
end

context "case_sensitive = nil" do
let(:uniqueness_opts) { { } }

it "does not emit warning" do
expect { expect(article.valid?).to eq(true) }.not_to output.to_stderr
end
end

context "case_sensitive = true" do
let(:uniqueness_opts) { { case_sensitive: true } }

it "does not emit warning" do
expect { expect(article.valid?).to eq(true) }.not_to output.to_stderr
end
end
end
end if Mobility::Loaded::ActiveRecord

0 comments on commit 1500871

Please sign in to comment.