module Uidable::ClassMethods
Public Instance Methods
uidable( uid_name: 'uid', uid_size: DEFAULT_UID_SIZE, read_only: true, presence: true, uniqueness: :create, set_to_param: false, scope: false)
click to toggle source
# 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 <<-RUBY, __FILE__, __LINE__ + 1 def self.included(base) if defined?(::ActiveRecord::Base) && base < ::ActiveRecord::Base base.before_validation :uidable_assign_#{uid_name}, on: :create #{scope ? "base.scope :'with_#{uid_name}', -> (uid) { where(:'#{uid_name}' => uid) }" : ''} #{set_to_param ? "base.include SetToParam#{uid_name}" : ''} #{read_only ? "base.attr_readonly :'#{uid_name}'" : ''} else #{read_only ? "attr_reader :'#{uid_name}'" : "attr_accessor :'#{uid_name}'"} end if base.respond_to?(:validates) #{presence ? "base.validates :'#{uid_name}', presence: true" : ''} #{uniqueness_check} end end module SetToParam#{uid_name} def to_param self.#{uid_name} end end private def uidable_assign_#{uid_name} self.#{uid_name} = gen_#{uid_name} end def gen_#{uid_name} Array.new(#{uid_size}){[*'a'..'z', *'0'..'9'].sample}.join end RUBY include mod end end
uidable_cols()
click to toggle source
# File lib/uidable.rb, line 79 def uidable_cols @uidable_cols ||= [] end