phase 3 (by technoweenie from http://pastie.caboo.se/32063)
# Now the incoming/outgoing methods are on item, so you can do:
#
# Item.incoming(:all, :order => 'created_at desc', :limit => 15)
#
# or
#
# @asset.items.incoming(:all, :order => 'created_at desc', :limit => 15)
class Item < ActiveRecord::Base
belongs_to :asset
def self.incoming(*args)
with_scope(:find => { :conditions => 'base_amount > 0'}) { find(*args) }
end
def self.outgoing(*args)
with_scope(:find => { :conditions => 'base_amount < 0'}) { find(*args) }
end
end
class Asset < ActiveRecord::Base
has_many :items, :dependent => :destroy_all
end
phase 4
# Now the incoming/outgoing methods are on Item, so you can do:
#
# Item.incoming(:all, :order => 'created_at desc', :limit => 15)
#
# but, there is also memoization in the Asset
#
# @asset.incoming_items(:all, :order => 'created_at desc', :limit => 15)
class Item < ActiveRecord::Base
belongs_to :asset
def self.incoming(*args)
with_scope(:find => { :conditions => 'base_amount > 0'}) { find(*args) }
end
def self.outgoing(*args)
with_scope(:find => { :conditions => 'base_amount < 0'}) { find(*args) }
end
end
class Module
def memoized_subcollection(pklass, name, conditions=nil)
class_eval <<-STR
def #{name}_#{pklass}(reload=false)
@#{name}_#{pklass} = nil if reload
@#{name}_#{pklass} ||= #{pklass.to_s.singularize.camelize}.#{name}(#{conditions})
end
STR
end
end
class Asset < ActiveRecord::Base
has_many :items, :dependent => :destroy_all
memoized_subcollection(:items, :incoming)
memoized_subcollection(:items, :outgoing)
end