class TopModel::Base

Attributes

attributes[RW]
new_record[W]

Public Class Methods

[](id)
Alias for: find
all() click to toggle source
# File lib/topmodel/base.rb, line 87
def all
  collection.new(records.values.deep_dup)
end
attributes(*attributes) click to toggle source
# File lib/topmodel/base.rb, line 27
def attributes(*attributes)
  self.known_attributes |= attributes.map(&:to_s)
end
belongs_assoc() click to toggle source
# File lib/topmodel/base.rb, line 9
def belongs_assoc
  @belongs_assoc ||= {}
end
collection(&block) click to toggle source
# File lib/topmodel/base.rb, line 21
def collection(&block)
  @collection ||= Class.new(Array)
  @collection.class_eval(&block) if block_given?
  @collection
end
count() click to toggle source
# File lib/topmodel/base.rb, line 83
def count
  records.length
end
create(atts = {}) click to toggle source

Create a new record. Example:

create(:name => "foo", :id => 1)
# File lib/topmodel/base.rb, line 118
def create(atts = {})
  rec = self.new(atts)
  rec.save && rec
end
create!(*args) click to toggle source
# File lib/topmodel/base.rb, line 123
def create!(*args)
  create(*args) || raise(InvalidRecord)
end
delete_all() click to toggle source

Removes all records without executing destroy callbacks.

# File lib/topmodel/base.rb, line 111
def delete_all
  records.clear
end
destroy(id) click to toggle source
# File lib/topmodel/base.rb, line 99
def destroy(id)
  find(id).destroy
end
destroy_all() click to toggle source

Removes all records and executes destroy callbacks.

# File lib/topmodel/base.rb, line 105
def destroy_all
  all.each {|r| r.destroy }
end
exists?(id) click to toggle source
# File lib/topmodel/base.rb, line 79
def exists?(id)
  records.has_key?(id)
end
find(id) click to toggle source

Find record by ID, or raise.

# File lib/topmodel/base.rb, line 50
def find(id)
  item = raw_find(id)
  item && item.dup
end
Also aliased as: []
first() click to toggle source
# File lib/topmodel/base.rb, line 56
def first
  item = records.values[0]
  item && item.dup
end
has_many_assoc() click to toggle source
# File lib/topmodel/base.rb, line 13
def has_many_assoc
  @has_many_assoc ||= {}
end
last() click to toggle source
# File lib/topmodel/base.rb, line 61
def last
  item = records.values[-1]
  item && item.dup
end
new(attributes = {}) click to toggle source
# File lib/topmodel/base.rb, line 151
def initialize(attributes = {})
  @new_record = true
  @attributes = {}.with_indifferent_access
  @attributes.merge!(known_attributes.inject({}) {|h, n| h[n] = nil; h })
  @changed_attributes = {}
  load(attributes)
end
primary_key() click to toggle source
# File lib/topmodel/base.rb, line 17
def primary_key
  @primary_key ||= 'id'
end
records() click to toggle source
# File lib/topmodel/base.rb, line 31
def records
  @records ||= {}
end
select(&block) click to toggle source
# File lib/topmodel/base.rb, line 91
def select(&block)
  collection.new(records.values.select(&block).deep_dup)
end
update(id, atts) click to toggle source
# File lib/topmodel/base.rb, line 95
def update(id, atts)
  find(id).update_attributes(atts)
end
where(options) click to toggle source
# File lib/topmodel/base.rb, line 66
def where(options)
  items = records.values.select do |r|
    options.all? do |k, v|
      if v.is_a?(Enumerable)
        v.include?(r.send(k))
      else
        r.send(k) == v
      end
    end
  end
  collection.new(items.deep_dup)
end

Public Instance Methods

==(other) click to toggle source
# File lib/topmodel/base.rb, line 183
def ==(other)
  other.equal?(self) || (other.instance_of?(self.class) && other.id == id)
end
clone() click to toggle source
# File lib/topmodel/base.rb, line 159
def clone
  cloned = attributes.reject {|k,v| k == self.class.primary_key }
  cloned = cloned.inject({}) do |attrs, (k, v)|
    attrs[k] = v.clone
    attrs
  end
  self.class.new(cloned)
end
destroy() click to toggle source
# File lib/topmodel/base.rb, line 262
def destroy
  raw_destroy
  self
end
dup() click to toggle source
# File lib/topmodel/base.rb, line 196
def dup
  self.class.new.tap do |base|
    base.attributes = attributes
    base.new_record = new_record?
  end
end
eql?(other) click to toggle source

Tests for equality (delegates to ==).

# File lib/topmodel/base.rb, line 188
def eql?(other)
  self == other
end
exists?() click to toggle source
# File lib/topmodel/base.rb, line 211
def exists?
  !new?
end
Also aliased as: persisted?
has_attribute?(name) click to toggle source
# File lib/topmodel/base.rb, line 243
def has_attribute?(name)
  @attributes.has_key?(name)
end
hash() click to toggle source
# File lib/topmodel/base.rb, line 192
def hash
  id.hash
end
id() click to toggle source

Gets the \id attribute of the item.

# File lib/topmodel/base.rb, line 174
def id
  attributes[self.class.primary_key]
end
id=(id) click to toggle source

Sets the \id attribute of the item.

# File lib/topmodel/base.rb, line 179
def id=(id)
  attributes[self.class.primary_key] = id
end
known_attributes() click to toggle source
# File lib/topmodel/base.rb, line 147
def known_attributes
  self.class.known_attributes | self.attributes.keys.map(&:to_s)
end
new?() click to toggle source
# File lib/topmodel/base.rb, line 168
def new?
  @new_record || false
end
Also aliased as: new_record?
new_record?()
Alias for: new?
persisted?()
Alias for: exists?
reload() click to toggle source
# File lib/topmodel/base.rb, line 223
def reload
  return self if new?
  item = self.class.find(id)
  load(item.attributes)
  return self
end
respond_to?(method, include_priv = false) click to toggle source
Calls superclass method
# File lib/topmodel/base.rb, line 249
def respond_to?(method, include_priv = false)
  method_name = method.to_s
  if attributes.nil?
    super
  elsif known_attributes.include?(method_name)
    true
  elsif method_name =~ /(?:=|\?)$/ && attributes.include?($`)
    true
  else
    super
  end
end
respond_to_without_attributes?(method, include_priv = false)
Alias for: respond_to?
save() click to toggle source
# File lib/topmodel/base.rb, line 203
def save
  new? ? create : update
end
save!() click to toggle source
# File lib/topmodel/base.rb, line 207
def save!
  save || raise(InvalidRecord)
end
update_attribute(name, value) click to toggle source
# File lib/topmodel/base.rb, line 230
def update_attribute(name, value)
  self.send("#{name}=".to_sym, value)
  self.save
end
update_attributes(attributes) click to toggle source
# File lib/topmodel/base.rb, line 235
def update_attributes(attributes)
  load(attributes) && save
end
update_attributes!(attributes) click to toggle source
# File lib/topmodel/base.rb, line 239
def update_attributes!(attributes)
  update_attributes(attributes) || raise(InvalidRecord)
end

Protected Instance Methods

create() click to toggle source
# File lib/topmodel/base.rb, line 288
def create
  self.id ||= generate_id
  self.new_record = false
  raw_create
  self.id
end
generate_id() click to toggle source
# File lib/topmodel/base.rb, line 276
def generate_id
  object_id
end
raw_create() click to toggle source
# File lib/topmodel/base.rb, line 284
def raw_create
  self.class.records[self.id] = self.dup
end
raw_destroy() click to toggle source
# File lib/topmodel/base.rb, line 280
def raw_destroy
  self.class.records.delete(self.id)
end
raw_update() click to toggle source
# File lib/topmodel/base.rb, line 295
def raw_update
  item = self.class.raw_find(id)
  item.load(attributes)
end
read_attribute(name) click to toggle source
# File lib/topmodel/base.rb, line 268
def read_attribute(name)
  @attributes[name]
end
update() click to toggle source
# File lib/topmodel/base.rb, line 300
def update
  raw_update
  true
end
write_attribute(name, value) click to toggle source
# File lib/topmodel/base.rb, line 272
def write_attribute(name, value)
  @attributes[name] = value
end