2 class Configuration # :nodoc:
3 attr_reader :blasted_tables, :loaded_scenarios, :record_metas, :table_readers, :scenario_helpers, :symbolic_names_to_id
6 @blasted_tables = Set.new
7 @record_metas = Hash.new
8 @table_readers = Module.new
9 @scenario_helpers = Module.new
10 @symbolic_names_to_id = Hash.new {|h,k| h[k] = Hash.new}
11 @loaded_scenarios = Array.new
14 # Given a created record (currently ScenarioModel or ScenarioRecord),
15 # update the table readers module appropriately such that this record and
16 # it's id are findable via methods like 'people(symbolic_name)' and
17 # 'person_id(symbolic_name)'.
18 def update_table_readers(record)
19 ids, record_meta = symbolic_names_to_id, record.record_meta # scoping assignments
21 ids[record_meta.table_name][record.symbolic_name] = record.id
22 table_readers.send :define_method, record_meta.id_reader do |*symbolic_names|
23 record_ids = symbolic_names.flatten.collect do |symbolic_name|
24 if symbolic_name.kind_of?(ActiveRecord::Base)
27 record_id = ids[record_meta.table_name][symbolic_name.to_sym]
28 raise ActiveRecord::RecordNotFound, "No object is associated with #{record_meta.table_name}(:#{symbolic_name})" unless record_id
32 record_ids.size > 1 ? record_ids : record_ids.first
35 table_readers.send :define_method, record_meta.record_reader do |*symbolic_names|
36 results = symbolic_names.flatten.collect do |symbolic_name|
37 symbolic_name.kind_of?(ActiveRecord::Base) ?
39 record_meta.record_class.find(send(record_meta.id_reader, symbolic_name))
41 results.size > 1 ? results : results.first
45 def update_scenario_helpers(scenario_class)
46 scenario_helpers.module_eval do
47 include scenario_class.helpers
52 !loaded_scenarios.blank?