diff --git a/lib/mobility/active_record/uniqueness_validator.rb b/lib/mobility/active_record/uniqueness_validator.rb index 14a47f610..e035628e5 100644 --- a/lib/mobility/active_record/uniqueness_validator.rb +++ b/lib/mobility/active_record/uniqueness_validator.rb @@ -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] @@ -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 diff --git a/spec/mobility/active_record_spec.rb b/spec/mobility/active_record_spec.rb index dc3a1a5dd..8a1a52dfc 100644 --- a/spec/mobility/active_record_spec.rb +++ b/spec/mobility/active_record_spec.rb @@ -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