card/lib/card/fetch/retrieve.rb
class Card
class Fetch
# retrieval and instantiation methods for Card::Fetch
module Retrieve
# look for card in cache. if that doesn't work, look in database
def retrieve_existing
return unless mark.present?
retrieve_from_cache || retrieve_from_db
end
def retrieve_from_cache
@card = Card.send "retrieve_from_cache_by_#{mark_type}",
mark_value, @opts[:local_only]
@card = nil if card&.new? && look_in_trash?
# don't return cached cards if looking in trash -
# we want the db version
card
end
def retrieve_from_db
query = retrieval_from_db_query
@card = query ? Card.where(query).take : nil
@cache_ready = true if card.present? && !card.trash
card
end
def retrieval_from_db_query
return unless (query = retrieval_from_db_query_base)
query[:trash] = false unless look_in_trash?
query
end
def retrieval_from_db_query_base
if mark_type == :key && mark.simple?
{ key: mark_value }
elsif (id = id_from_mark)
{ id: id }
end
end
def id_from_mark
mark_type == :id ? mark_value : Lexicon.id(mark_value)
end
# In both the cache and the db, ids and keys are used to retrieve card data.
# These methods identify the kind of mark to use and its value
def mark_type
@mark_type ||= mark.is_a?(Integer) ? :id : :key
end
def mark_value
@mark_value ||= mark.is_a?(Integer) ? mark : mark.key
end
end
end
end