/
validations.rb
50 lines (44 loc) · 1.45 KB
/
validations.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# encoding: UTF-8
module MongoMapper
module Plugins
module Validations
def self.configure(model)
model.class_eval do
include Validatable
extend Validations::DocumentMacros
end
end
module DocumentMacros
def validates_uniqueness_of(*args)
add_validations(args, Validations::ValidatesUniquenessOf)
end
end
class ValidatesUniquenessOf < Validatable::ValidationBase
option :scope, :case_sensitive
default :case_sensitive => true
def valid?(instance)
value = instance[attribute]
return true if allow_blank && value.blank?
return true if allow_nil && value.nil?
base_conditions = case_sensitive ? {self.attribute => value} : {}
doc = instance.class.first(base_conditions.merge(scope_conditions(instance)).merge(where_conditions(instance)))
doc.nil? || instance._id == doc._id
end
def message(instance)
super || "has already been taken"
end
def scope_conditions(instance)
return {} unless scope
Array(scope).inject({}) do |conditions, key|
conditions.merge(key => instance[key])
end
end
def where_conditions(instance)
conditions = {}
conditions[attribute] = /^#{Regexp.escape(instance[attribute].to_s)}$/i unless case_sensitive
conditions
end
end
end
end
end