lib/referehencible.rb in referehencible-0.1.1 vs lib/referehencible.rb in referehencible-0.2.0

- old
+ new

@@ -1,34 +1,46 @@ require 'referehencible/version' require 'securerandom' module Referehencible - def self.included(base) - base.class_eval do - ### - # Validations - # - validates :guid, - presence: true, - uniqueness: true, - format: { - with: /[a-f0-9]{32}/ }, - length: { - is: 32 } + module ClassMethods + def referenced_by(*referenced_attributes) + referenced_attributes.each do |reference_attribute| + validates reference_attribute, + presence: true, + uniqueness: true, + format: { + with: /[a-f0-9]{32}/ }, + length: { + is: 32 } - ### - # Hooks - # - before_create :generate_guid + define_method(reference_attribute) do + generate_guid(reference_attribute) + end - ### - # ActiveRecord Overrides - # - def guid; generate_guid; end + define_singleton_method("by_#{reference_attribute}") do |guid_to_find| + where(:"#{reference_attribute}" => guid_to_find). + first || + unknown_reference_object + end + + after_initialize lambda { generate_guid reference_attribute } + end + + private + + define_method(:generate_guid) do |reference_attribute| + read_attribute(reference_attribute) || write_attribute(reference_attribute, SecureRandom.hex(16)) + end + + define_singleton_method(:unknown_reference_object) do + return new unless respond_to?(:as_null_object) + + as_null_object + end end end -private - def generate_guid - read_attribute(:guid) || write_attribute('guid', SecureRandom.hex(16)) + def self.included(base) + base.extend ClassMethods end end