Sha256: c603c6e463da6847c01464bc30ae9521196757f0aac3976f09ed9aaebec09b90

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

module HasPublicId
  module ActiveRecord
    module InstanceMethods
      def to_param
        self.send(public_id_attr)
      end
      def public_id_attr
        self.class.public_id_attr
      end
      def initialize_public_id
        if has_attribute?(public_id_attr)
          read_attribute(public_id_attr) or
          write_attribute(public_id_attr, self.class.new_public_id)
        end
      end
    end
    module Mixin
      extend ActiveSupport::Concern
      included do
      end
      module ClassMethods
        def has_public_id(attribute_name, *args)
          return if respond_to?(:public_id_attribute)
          options = args.extract_options!

          class_attribute :public_id_attr, :public_id_options

          class << self

            def initialize_public_ids!
              self.where(self.public_id_attr => nil).find_each do |obj|
                obj.update_attribute(self.public_id_attr, self.new_public_id)
              end
            end

            def find_by_public_id(public_id)
              where(self.public_id_attr => public_id).first
            end

            def find_by_public_id!(public_id)
              where(self.public_id_attr => public_id).first!
            end

            def new_public_id
              new_id = ::HasPublicId::Util.new_public_id(self, self.public_id_options)
              while(self.public_id_options[:check_unique])
                break unless where(self.public_id_attr => new_id).exists?
                new_id = ::HasPublicId::Util.new_public_id(self, self.public_id_options)
              end
              return new_id
            end
          end
          self.public_id_attr     = attribute_name
          self.public_id_options  = options
          include ::HasPublicId::ActiveRecord::InstanceMethods
          after_initialize :initialize_public_id
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
has_public_id-1.1.9 lib/has_public_id/activerecord/mixin.rb