Sha256: 2da68158e004014828727e8c13c61b6019aa5ea56347a869c2a05e9be1832a88

Contents?: true

Size: 1.25 KB

Versions: 9

Compression:

Stored size: 1.25 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

9 entries across 9 versions & 1 rubygems

Version Path
mini_defender-0.3.6 lib/mini_defender/rules/unique.rb
mini_defender-0.3.5 lib/mini_defender/rules/unique.rb
mini_defender-0.3.2 lib/mini_defender/rules/unique.rb
mini_defender-0.3.0 lib/mini_defender/rules/unique.rb
mini_defender-0.2.0 lib/mini_defender/rules/unique.rb
mini_defender-0.1.10 lib/mini_defender/rules/unique.rb
mini_defender-0.1.9 lib/mini_defender/rules/unique.rb
mini_defender-0.1.8 lib/mini_defender/rules/unique.rb
mini_defender-0.1.6 lib/mini_defender/rules/unique.rb