Module: UsesAlchemy

Defined in:
lib/alchemy/uses_alchemy.rb

Instance Method Summary collapse

Instance Method Details

#uses_alchemy(association_id, opts = {}) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/alchemy/uses_alchemy.rb', line 3

def uses_alchemy(association_id, opts={})
	opts[:on]	||= "#{self.name.downcase}_id"
	opts[:name]	||= association_id
	opts[:store] ||= :id
	
	klass = association_id.to_s.singularize.camelize.constantize
	opts[:proc] ||= Proc.new { |list| list.map{ |aid| klass.find(aid) } }
	
	alchemy_namespace = "#{association_id}_#{opts[:on]}"
	alchemy_listname ="#{alchemy_namespace}_list_name"
	
	define_method(alchemy_listname) do
		"#{self.class}|#{id}|#{alchemy_namespace}"
	end
	
	define_method(opts[:name]) do |*reload|
		list = ALCHEMY.get(send(alchemy_listname)) if !reload.first
		
		if reload.first || list.nil?
		  refreshed_list = klass.find(:all, :select=>"#{opts[:store]}, #{opts[:on]}", :conditions=>["#{opts[:on]} = ?", self.id])
		  refreshed_list = refreshed_list.map(&opts[:store])
		  ALCHEMY.replace(send(alchemy_listname), refreshed_list.to_json)
		  list = refreshed_list
		end
		opts[:proc].call(list)
	end
end