Module: Uniqueness::Model

Defined in:
lib/uniqueness/model.rb

Overview

:nodoc:

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



3
4
5
6
7
# File 'lib/uniqueness/model.rb', line 3

def self.included(base)
  base.extend ClassMethods
  # Track all uniqueness arguments
  base.class_attribute :uniqueness_options
end

Instance Method Details

#uniqueness_ambigious_dictionaryObject



69
70
71
# File 'lib/uniqueness/model.rb', line 69

def uniqueness_ambigious_dictionary
  [:b, :B, :o, :O, :q, :I, :l, :L, :s, :S, :u, :U, :z, :Z].map(&:to_s)
end

#uniqueness_dictionaryObject

Dictionary used for uniqueness generation



65
66
67
# File 'lib/uniqueness/model.rb', line 65

def uniqueness_dictionary
  [*(:A..:Z), *(:a..:z), *(0..9)].map(&:to_s)
end

#uniqueness_generateObject

Generates a new code based on given options



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/uniqueness/model.rb', line 51

def uniqueness_generate
  self.uniqueness_options.each do |field, options|
    value = send(field)
    unless value.present?
      dict = uniqueness_dictionary - options[:blacklist]
      dict -= [*(:A..:Z)].map(&:to_s) unless options[:case_sensitive]
      dict -= uniqueness_ambigious_dictionary if options[:type].to_sym == :human
      value = Array.new(options[:length]).map { dict[rand(dict.length)] }.join
      self.send("#{field}=", value)
    end
  end
end

#uniqueness_validationObject



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/uniqueness/model.rb', line 73

def uniqueness_validation
  self.class.uniqueness_options.each do |field, options|
    value = send(field)
    if value.nil?
      errors.add(field, 'should not be empty')
    else
      conditions = {}
      options[:scope].each do |s|
        conditions[s] = send(s)
      end
      conditions[field] = value
      query = self.class.where(conditions)
      errors.add(field, 'should be unique') if query.any?
    end
  end
end