class LazyRecord::Relation

Collection of LazyRecord objects that are bound to a single class. The Relation inherits scope methods from the class it is bound to.

Attributes

all[R]
klass[R]

Public Class Methods

new(klass:, collection: []) click to toggle source
# File lib/lazy_record/relation.rb, line 11
def initialize(klass:, collection: [])
  klass = klass.call if klass.is_a? Proc
  klass_argument_error unless klass.is_a?(Class)
  @klass = klass
  @all   = []
  self_extend_scopes_module
  collection.each do |object|
    @all << object && next if object.is_a?(klass)
    collection_argument_error
  end
end

Public Instance Methods

<<(other) click to toggle source
# File lib/lazy_record/relation.rb, line 32
def <<(other)
  message = "object must be of type #{klass}"
  raise ArgumentError, message unless other.is_a?(klass)
  all << other unless all.include?(other)
end
[](index) click to toggle source
# File lib/lazy_record/relation.rb, line 64
def [](index)
  all[index]
end
collection_argument_error() click to toggle source
# File lib/lazy_record/relation.rb, line 23
def collection_argument_error
  message = "Argument must be a collection of #{klass.to_s.tableize}"
  raise ArgumentError, message
end
each(&block) click to toggle source
# File lib/lazy_record/relation.rb, line 60
def each(&block)
  all.each(&block)
end
empty?() click to toggle source
# File lib/lazy_record/relation.rb, line 72
def empty?
  all.empty?
end
inspect() click to toggle source
# File lib/lazy_record/relation.rb, line 38
def inspect
  "\#<#{klass}Relation [#{all.map(&:inspect).join(', ')}]>"
end
klass_argument_error() click to toggle source
# File lib/lazy_record/relation.rb, line 28
def klass_argument_error
  raise ArgumentError, '`klass` keyword argument must be a class'
end
last() click to toggle source
# File lib/lazy_record/relation.rb, line 68
def last
  self[-1]
end
self_extend_scopes_module() click to toggle source
# File lib/lazy_record/relation.rb, line 82
def self_extend_scopes_module
  return unless klass.const_defined?(Scopes::SCOPE_MODULE_NAME,
                                     _search_ancestors = false)
  extend(klass.const_get(Scopes::SCOPE_MODULE_NAME))
end
where(condition = nil) { |instance| ... } click to toggle source
# File lib/lazy_record/relation.rb, line 42
def where(condition = nil)
  result = all.select do |instance|
    if condition.is_a? Hash
      select_by_hash_condition(condition, instance)
    elsif block_given?
      yield instance
    end
  end
  self.class.new(klass: klass, collection: result)
end

Private Instance Methods

clear() click to toggle source
# File lib/lazy_record/relation.rb, line 76
def clear
  all.clear
end
select_by_hash_condition(condition, instance) click to toggle source
# File lib/lazy_record/relation.rb, line 53
def select_by_hash_condition(condition, instance)
  condition.all? do |key, val|
    val = val.call if val.is_a? Proc
    instance.send(key) == val
  end
end