Sha256: 00f54f5876c725b56b0a0840acc66a43e50f50045cea051d04c481b1fa1d20bc

Contents?: true

Size: 1.26 KB

Versions: 27

Compression:

Stored size: 1.26 KB

Contents

# frozen_string_literal: true

class MiniDefender::Rules::Unique < MiniDefender::Rule
  def initialize(model, column = nil)
    unless model.is_a?(String) || model.is_a?(Class) && model.ancestors.include?(ActiveRecord::Base)
      raise ArgumentError, 'model name must be a string or ActiveRecord::Base'
    end

    raise ArgumentError, 'Column name must be a string' unless column.is_a?(String) || column.nil?

    @model = model
    @model = @model.camelcase.constantize if model.is_a?(String)
    @column = column
    @ignore = nil
    @additional_scope = nil
  end

  def self.signature
    'unique'
  end

  def should_ignore(value)
    @ignore = value
    self
  end

  def scope_by(callback)
    @additional_scope = callback
    self
  end

  def self.make(args)
    raise ArgumentError, 'Model and column are required.' unless args.length == 2

    self.new(args[0], args[1])
  end

  def passes?(attribute, value, validator)
    @column = attribute.split('.')[-1] if @column.nil?

    query = @model.where(@column => value)
    query = @additional_scope.call(query) unless @additional_scope.nil?
    query = query.where.not(@column => @ignore) unless @ignore.nil?

    !query.exists?
  end

  def message(attribute, value, validator)
    "The value already exists."
  end
end

Version data entries

27 entries across 27 versions & 1 rubygems

Version Path
mini_defender-0.6.8 lib/mini_defender/rules/unique.rb
mini_defender-0.6.7 lib/mini_defender/rules/unique.rb
mini_defender-0.6.5 lib/mini_defender/rules/unique.rb
mini_defender-0.6.4 lib/mini_defender/rules/unique.rb
mini_defender-0.6.3 lib/mini_defender/rules/unique.rb
mini_defender-0.6.2 lib/mini_defender/rules/unique.rb
mini_defender-0.6.1 lib/mini_defender/rules/unique.rb
mini_defender-0.6.0 lib/mini_defender/rules/unique.rb
mini_defender-0.5.8 lib/mini_defender/rules/unique.rb
mini_defender-0.5.7 lib/mini_defender/rules/unique.rb
mini_defender-0.5.6 lib/mini_defender/rules/unique.rb
mini_defender-0.5.5 lib/mini_defender/rules/unique.rb
mini_defender-0.5.4 lib/mini_defender/rules/unique.rb
mini_defender-0.5.3 lib/mini_defender/rules/unique.rb
mini_defender-0.5.2 lib/mini_defender/rules/unique.rb
mini_defender-0.5.1 lib/mini_defender/rules/unique.rb
mini_defender-0.5.0 lib/mini_defender/rules/unique.rb
mini_defender-0.4.1 lib/mini_defender/rules/unique.rb
mini_defender-0.4.0 lib/mini_defender/rules/unique.rb
mini_defender-0.3.14 lib/mini_defender/rules/unique.rb