module WolfCore::FriendlyModelId
def by_friendly_id(friendly_id)
def by_friendly_id(friendly_id) find_by(friendly_id: friendly_id) end
def convert_candidate_to_friendly_id(candidate)
def convert_candidate_to_friendly_id(candidate) candidate = Array(candidate) candidate.map!(&:to_sym).uniq! candidate.map do |field| field_value = send(field) parse_field_value(field_value) end.join("-") end
def find_unique_friendly_id
def find_unique_friendly_id friendly_id_candidates_array.each do |candidate| friendly_id = convert_candidate_to_friendly_id(candidate) return friendly_id if friendly_id.present? && !friendly_id_used?(friendly_id) end nil end
def friendly_id_candidates
def friendly_id_candidates [:id] end
def friendly_id_candidates_array
def friendly_id_candidates_array Array(friendly_id_candidates) end
def friendly_id_used?(friendly_id)
def friendly_id_used?(friendly_id) self.class.where.not(id: id).find_by(friendly_id: friendly_id).present? end
def generate_friendly_id
def generate_friendly_id friendly_id = find_unique_friendly_id return friendly_id if friendly_id.present? default_candidate = Array(friendly_id_candidates_array.first) + [:id] convert_candidate_to_friendly_id(default_candidate) end
def parse_field_value(field_value)
def parse_field_value(field_value) field_value = to_kebab_case(field_value) remove_non_alphanumeric_chars(field_value, exceptions: "-") end
def set_friendly_id
def set_friendly_id return if friendly_id.present? self.friendly_id = generate_friendly_id end