class Relation

Constants

SQL_COMMANDS

Attributes

cache[RW]
klass[R]
sql_clauses[R]
values[RW]

Public Class Methods

new(klass, values = [], sql_clauses = {}) click to toggle source
# File lib/laris/larisrecord/relation.rb, line 14
def initialize(klass, values = [], sql_clauses = {})
  @klass = klass
  @values = values
  @sql_clauses = sql_defaults.merge(sql_clauses)
  @cache = nil
end

Public Instance Methods

joins(table, on = nil) click to toggle source

allows only a single join

# File lib/laris/larisrecord/relation.rb, line 36
def joins(table, on = nil)
  condition = "#{table} ON #{on}"

  sql_clauses[:joins] =
    [sql_clauses[:joins], condition].compact.join(' JOIN ')

  self
end
limit(n) click to toggle source
# File lib/laris/larisrecord/relation.rb, line 45
def limit(n)
  sql_clauses[:limit] = n
  self
end
method_missing(method, *args, &blk) click to toggle source
# File lib/laris/larisrecord/relation.rb, line 21
def method_missing(method, *args, &blk)
  query if cache.nil?
  cache.send(method, *args, &blk)
end
order(column, direction = 'ASC') click to toggle source
# File lib/laris/larisrecord/relation.rb, line 30
def order(column, direction = 'ASC')
  sql_clauses[:order] = "#{table_name}.#{column} #{direction}"
  self
end
reload!() click to toggle source
# File lib/laris/larisrecord/relation.rb, line 26
def reload!
  query
end
where(conditions) click to toggle source
# File lib/laris/larisrecord/relation.rb, line 50
def where(conditions)
  new_fragments = conditions.map do |attr_name, value|
    values << value
    "#{table_name}.#{attr_name} = ?"
  end

  where_fragments = new_fragments.unshift(sql_clauses[:where])
  sql_clauses[:where] = where_fragments.compact.join(" AND ")

  self
end

Private Instance Methods

query() click to toggle source
# File lib/laris/larisrecord/relation.rb, line 63
def query
  results = DBConnection.execute(statement, values)
  self.cache = klass.parse_all(results)
end
sql_defaults() click to toggle source
# File lib/laris/larisrecord/relation.rb, line 68
def sql_defaults
  {
    select: "#{table_name}.*",
    from: "#{table_name}"
  }
end
statement() click to toggle source
# File lib/laris/larisrecord/relation.rb, line 75
def statement
  clauses = SQL_COMMANDS.map do |keyword, command|
    "#{command} #{sql_clauses[keyword]}" if sql_clauses[keyword]
  end
  clauses.compact.join(" ")
end
table_name() click to toggle source
# File lib/laris/larisrecord/relation.rb, line 82
def table_name
  klass.table_name
end