class ActiveRecall::Deck

Public Class Methods

add_deck(user) click to toggle source
# File lib/active_recall/models/deck.rb, line 35
def self.add_deck(user)
  create!(user)
end

Public Instance Methods

<<(source) click to toggle source
# File lib/active_recall/models/deck.rb, line 29
def <<(source)
  raise ArgumentError, 'Word already in the stack' if include?(source)

  items << ActiveRecall::Item.new(deck: self, source_id: source.id, source_type: source.class.name)
end
==(other) click to toggle source
# File lib/active_recall/models/deck.rb, line 21
def ==(other)
  _items == other
end
_items() click to toggle source
# File lib/active_recall/models/deck.rb, line 25
def _items
  source_class.find(items.pluck(:source_id))
end
box(number) click to toggle source
# File lib/active_recall/models/deck.rb, line 82
def box(number)
  source_class.find(items.where(box: number).pluck(:source_id))
end
delete(source) click to toggle source
# File lib/active_recall/models/deck.rb, line 39
def delete(source)
  ActiveRecall::Item
    .find_by(deck: self, source_id: source.id, source_type: source.class.name)
    .destroy
end
each() { |item| ... } click to toggle source
# File lib/active_recall/models/deck.rb, line 11
def each
  _items.each do |item|
    if block_given?
      yield item
    else
      yield item
    end
  end
end
expired() click to toggle source
# File lib/active_recall/models/deck.rb, line 78
def expired
  source_class.find(items.expired.pluck(:source_id))
end
failed() click to toggle source
# File lib/active_recall/models/deck.rb, line 70
def failed
  source_class.find(items.failed.pluck(:source_id))
end
known() click to toggle source
# File lib/active_recall/models/deck.rb, line 74
def known
  source_class.find(items.known.pluck(:source_id))
end
last() click to toggle source
# File lib/active_recall/models/deck.rb, line 62
def last
  items.order('created_at desc').limit(1).first.try(:source)
end
next() click to toggle source

OPTIMIZE: Use optimized review and build only the record to be returned

# File lib/active_recall/models/deck.rb, line 53
def next
  word = nil
  %i[untested failed expired].each do |category|
    word = items.send(category).order(random_order_function).limit(1).map(&:source).first
    break if word
  end
  word
end
review() click to toggle source

OPTIMIZE: Attempt in active record, rather than array of Ruby records

# File lib/active_recall/models/deck.rb, line 46
def review
  %i[untested failed expired].inject([]) do |words, s|
    words += items.send(s).order(random_order_function).map(&:source)
  end
end
source_class() click to toggle source
# File lib/active_recall/models/deck.rb, line 86
def source_class
  user.deck_name.to_s.singularize.titleize.constantize
end
untested() click to toggle source
# File lib/active_recall/models/deck.rb, line 66
def untested
  source_class.find(items.untested.pluck(:source_id))
end

Private Instance Methods

mysql?() click to toggle source
# File lib/active_recall/models/deck.rb, line 96
def mysql?
  source_class.connection.adapter_name == 'Mysql2'
end
random_order_function() click to toggle source
# File lib/active_recall/models/deck.rb, line 92
def random_order_function
  Arel.sql(mysql? ? 'RAND()' : 'random()')
end