class MotionRecord::Scope

Attributes

conditions[R]
klass[R]

Public Class Methods

new(klass, options = {}) click to toggle source
# File lib/motion_record/scope.rb, line 10
def initialize(klass, options = {})
  @klass = klass
  @conditions = options[:conditions] || {} # TODO: freeze?
  @order = options[:order]
  @limit = options[:limit]
end

Public Instance Methods

average(column) click to toggle source
# File lib/motion_record/scope.rb, line 85
def average(column)
  calculate(:average, column)
end
count(column=nil) click to toggle source

Calculations

# File lib/motion_record/scope.rb, line 69
def count(column=nil)
  calculate(:count, column)
end
delete_all() click to toggle source
# File lib/motion_record/scope.rb, line 63
def delete_all
  connection.delete(self)
end
exists?() click to toggle source

Read-only queries

# File lib/motion_record/scope.rb, line 33
def exists?
  count > 0
end
find(id) click to toggle source
# File lib/motion_record/scope.rb, line 41
def find(id)
  self.where(@klass.primary_key => id).first
end
find_all() click to toggle source
# File lib/motion_record/scope.rb, line 45
def find_all
  connection.select(self).map do |row|
    record = @klass.new(@klass.deserialize_table_params(row))
    record.mark_persisted!
    record
  end
end
first() click to toggle source
# File lib/motion_record/scope.rb, line 37
def first
  limit(1).find_all.first
end
limit(limit_value) click to toggle source
# File lib/motion_record/scope.rb, line 27
def limit(limit_value)
  Scope.new(@klass, :conditions => @conditions, :order => @order, :limit => limit_value)
end
maximum(column) click to toggle source
# File lib/motion_record/scope.rb, line 73
def maximum(column)
  calculate(:maximum, column)
end
minimum(column) click to toggle source
# File lib/motion_record/scope.rb, line 77
def minimum(column)
  calculate(:minimum, column)
end
order(ordering_term) click to toggle source
# File lib/motion_record/scope.rb, line 23
def order(ordering_term)
  Scope.new(@klass, :conditions => @conditions, :order => ordering_term, :limit => @limit)
end
pluck(attribute) click to toggle source
# File lib/motion_record/scope.rb, line 53
def pluck(attribute)
  connection.select(self).map { |row| row[attribute] }
end
predicate() click to toggle source
# File lib/motion_record/scope.rb, line 95
def predicate
  predicate_segments.join(" ")
end
predicate?() click to toggle source

SQL helpers

# File lib/motion_record/scope.rb, line 91
def predicate?
  predicate_segments.any?
end
predicate_values() click to toggle source
# File lib/motion_record/scope.rb, line 99
def predicate_values
  condition_columns.map { |column| @conditions[column] }
end
sum(column) click to toggle source
# File lib/motion_record/scope.rb, line 81
def sum(column)
  calculate(:sum, column)
end
update_all(params) click to toggle source

Persistence queries

# File lib/motion_record/scope.rb, line 59
def update_all(params)
  connection.update(self, params)
end
where(conditions={}) click to toggle source

Scope builder

# File lib/motion_record/scope.rb, line 19
def where(conditions={})
  Scope.new(@klass, :conditions => @conditions.merge(conditions), :order => @order, :limit => @limit)
end

Protected Instance Methods

calculate(method, column) click to toggle source
# File lib/motion_record/scope.rb, line 105
def calculate(method, column)
  connection.calculate(self, method, column)
end
condition_columns() click to toggle source
# File lib/motion_record/scope.rb, line 125
def condition_columns
  @condition_columns ||= @conditions.keys
end
connection() click to toggle source
# File lib/motion_record/scope.rb, line 129
def connection
  Base.connection
end
predicate_segments() click to toggle source
# File lib/motion_record/scope.rb, line 109
def predicate_segments
  unless @predicate_segments
    @predicate_segments = []
    if condition_columns.any?
      @predicate_segments << "WHERE #{condition_columns.map { |c| "#{c} = ? " }.join " AND "}"
    end
    if @order
      @predicate_segments << "ORDER BY #{@order}"
    end
    if @limit
      @predicate_segments << "LIMIT #{@limit}"
    end
  end
  @predicate_segments
end