class Card::Virtual

Model for the card_virtuals table. It provides method to get and store content for virtual cards from the card_virtuals table.

Public Class Methods

create(card, virtual_content=nil) { |: generate_virtual_content| ... } click to toggle source
# File lib/card/virtual.rb, line 13
def create card, virtual_content=nil
  validate_card card
  virtual_content ||= block_given? ? yield : card.generate_virtual_content
  create! left_id: left_id(card),
          right_id: right_id(card),
          left_key: card.name.left_key,
          content: virtual_content
end
create_or_update(card, virtual_content) click to toggle source
# File lib/card/virtual.rb, line 22
def create_or_update card, virtual_content
  if (virtual_card = find_by_card(card))
    virtual_card.update virtual_content
  else
    create card, virtual_content
  end
end
fetch(card, &block) click to toggle source
# File lib/card/virtual.rb, line 34
def fetch card, &block
  find_by_card(card) || create(card, &block)
end
fetch_content(card, &block) click to toggle source
# File lib/card/virtual.rb, line 30
def fetch_content card, &block
  find_content_by_card(card) || create(card, &block).content
end
find_by_card(card) click to toggle source
# File lib/card/virtual.rb, line 49
def find_by_card card
  where_card(card).take
end
find_content_by_card(card) click to toggle source
# File lib/card/virtual.rb, line 45
def find_content_by_card card
  where_card(card)&.pluck(:content)&.first
end
refresh(card) click to toggle source
# File lib/card/virtual.rb, line 38
def refresh card
  virtual = find_by_card(card)
  return create(card) unless virtual

  virtual.update card.generate_virtual_content
end

Private Class Methods

left_id(card) click to toggle source
# File lib/card/virtual.rb, line 65
def left_id card
  if card.compound?
    card.left_id&.positive? ? card.left_id : card.left&.id
  else
    card.id
  end
end
right_id(card) click to toggle source
# File lib/card/virtual.rb, line 73
def right_id card
  if card.compound?
    card.right_id&.positive? ? card.right_id : card.right&.id
  else
    -2
  end
end
validate_card(card) click to toggle source
# File lib/card/virtual.rb, line 81
def validate_card card
  reason ||=
    if card.compound?
      "needs left_id" unless left_id(card)
      "needs right_id" unless right_id(card)
    elsif !card.id
      "needs id"
    end
  return unless reason

  raise Card::Error, card.name, "count not cacheable: card #{card.name} #{reason}"
end
where_card(card) click to toggle source
# File lib/card/virtual.rb, line 55
def where_card card
  query = { right_id: right_id(card) }
  if (lid = left_id(card))
    query[:left_id] = lid
  else
    query[:left_key] = card.name.left_key
  end
  where query
end

Public Instance Methods

update(new_content) click to toggle source
# File lib/card/virtual.rb, line 7
def update new_content
  update! content: new_content
  new_content
end