27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# File 'lib/uidable.rb', line 27
def uidable(
uid_name: 'uid',
uid_size: DEFAULT_UID_SIZE,
read_only: true,
presence: true,
uniqueness: :create,
set_to_param: false,
scope: false)
unless uidable_cols.include?(uid_name.to_sym)
uniqueness_check = case (uniqueness.to_s.to_sym)
when :create, :true then "base.validates :'#{uid_name}', uniqueness: true, on: :create"
when :always then "base.validates :'#{uid_name}', uniqueness: true"
else ''
end
uidable_cols << uid_name.to_sym
mod = Module.new
mod.module_eval " def self.included(base)\n if defined?(::ActiveRecord::Base) && base < ::ActiveRecord::Base\n base.before_validation :uidable_assign_\#{uid_name}, on: :create\n \#{scope ? \"base.scope :'with_\#{uid_name}', -> (uid) { where(:'\#{uid_name}' => uid) }\" : ''}\n \#{set_to_param ? \"base.include SetToParam\#{uid_name}\" : ''}\n \#{read_only ? \"base.attr_readonly :'\#{uid_name}'\" : ''}\n else\n \#{read_only ? \"attr_reader :'\#{uid_name}'\" : \"attr_accessor :'\#{uid_name}'\"}\n end\n if base.respond_to?(:validates)\n \#{presence ? \"base.validates :'\#{uid_name}', presence: true\" : ''}\n \#{uniqueness_check}\n end\n end\n\n module SetToParam\#{uid_name}\n def to_param\n self.\#{uid_name}\n end\n end\n\n private\n\n def uidable_assign_\#{uid_name}\n self.\#{uid_name} = gen_\#{uid_name}\n end\n\n def gen_\#{uid_name}\n Array.new(\#{uid_size}){[*'a'..'z', *'0'..'9'].sample}.join\n end\n RUBY\n include mod\n end\nend\n", __FILE__, __LINE__ + 1
|