Module: Identifiable::Model

Extended by:
ActiveSupport::Concern
Defined in:
lib/identifiable/model.rb

Instance Method Summary collapse

Instance Method Details

#set_public_id!Object

If we don’t have a public ID yet, this method fetches the stylist for this class and finds a new, valid public id, and assigns it to the public ID column.

Raises:



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/identifiable/model.rb', line 97

def set_public_id!
  # We don't want to set the public id if there's already a value in the
  # column, so exit early if that's the case.
  return unless self[self.class.identifiable_column].blank?

  # Create a new stylist for this record, that'll return random IDs
  # matching the class' style and length options.
  stylist = Identifiable::Stylist.new(record: self)
  new_public_id = nil

  # Loop until we find an unused public ID or we run out of attempts.
  100.times do
    new_public_id = stylist.random_id
    break if self.class.find_by_public_id(new_public_id).nil?

    new_public_id = nil
  end

  # If we ran out of attempts, this probably means the length is too short,
  # since we kept colliding with existing records. Raise an error to let
  # the developers know that they need to up the length of the public ID.
  raise Identifiable::Errors::RanOutOfAttemptsToSetPublicIdError if new_public_id.nil?

  # If we got this far, we've got a new valid public ID, time to set it!
  self[self.class.identifiable_column] = new_public_id
end

#to_keyObject

By overriding ActiveRecord’s #to_key, this means that Rails’ helpers, such as dom_id will use the public ID instead of the regular ID when identifying the record.



127
128
129
# File 'lib/identifiable/model.rb', line 127

def to_key
  [self[self.class.identifiable_column]]
end

#to_paramObject

By overriding ActiveRecord’s #to_param, this means that Rails’ helpers, such as the link_to helpers will default to using the public ID instead of the regular ID when identifying the record.



134
135
136
# File 'lib/identifiable/model.rb', line 134

def to_param
  self[self.class.identifiable_column]
end