module Hashid::Rails::ClassMethods
def decode_id(ids, fallback: false)
-
fallback
(Boolean
) -- indicates whether to return the passed in -
ids
(String, Integer, Array
) -- id(s) to decode.
def decode_id(ids, fallback: false) if ids.is_a?(Array) ids.map { |id| hashid_decode(id, fallback: fallback) } else hashid_decode(ids, fallback: fallback) end end
def encode_id(ids)
def encode_id(ids) if ids.is_a?(Array) ids.map { |id| hashid_encode(id) } else hashid_encode(ids) end end
def find(*ids)
def find(*ids) expects_array = ids.first.is_a?(Array) uniq_ids = ids.flatten.compact.uniq uniq_ids = uniq_ids.first unless expects_array || uniq_ids.size > 1 if hashid_configuration.override_find super(decode_id(uniq_ids, fallback: true)) else super end end
def find_by_hashid(hashid)
def find_by_hashid(hashid) find_by(id: decode_id(hashid, fallback: false)) end
def find_by_hashid!(hashid)
def find_by_hashid!(hashid) find_by!(id: decode_id(hashid, fallback: false)) end
def has_many(*args, &block)
def has_many(*args, &block) options = args.extract_options! options[:extend] = Array(options[:extend]).push(ClassMethods) super(*args, **options, &block) end
def hashid_config(options = {})
def hashid_config(options = {}) config = Hashid::Rails.configuration.dup config.pepper = table_name options.each do |attr, value| config.public_send("#{attr}=", value) end @hashid_configuration = config end
def hashid_configuration
def hashid_configuration @hashid_configuration || hashid_config end
def hashid_decode(id, fallback:)
def hashid_decode(id, fallback:) fallback_value = fallback ? id : nil decoded_hashid = hashids.decode(id.to_s) if hashid_configuration.sign_hashids valid_hashid?(decoded_hashid) ? decoded_hashid.last : fallback_value else decoded_hashid.first || fallback_value end rescue Hashids::InputError fallback_value end
def hashid_encode(id)
def hashid_encode(id) return nil if id.nil? if hashid_configuration.sign_hashids hashids.encode(HASHID_TOKEN, id) else hashids.encode(id) end end
def hashids
def hashids Hashids.new(*hashid_configuration.to_args) end
def relation
def relation super.tap { |r| r.extend ClassMethods } end
def reset_hashid_config
def reset_hashid_config @hashid_configuration = nil end
def valid_hashid?(decoded_hashid)
def valid_hashid?(decoded_hashid) decoded_hashid.size == 2 && decoded_hashid.first == HASHID_TOKEN end