magic_model_generator 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (300) hide show
  1. data/CHANGELOG +0 -0
  2. data/README +3 -0
  3. data/Rakefile +96 -0
  4. data/examples/singleview/account.rb +94 -0
  5. data/examples/singleview/account_history.rb +21 -0
  6. data/examples/singleview/account_reservation.rb +26 -0
  7. data/examples/singleview/account_type.rb +54 -0
  8. data/examples/singleview/account_type_aging.rb +17 -0
  9. data/examples/singleview/account_type_variable.rb +8 -0
  10. data/examples/singleview/address.rb +8 -0
  11. data/examples/singleview/address_format.rb +49 -0
  12. data/examples/singleview/address_history.rb +28 -0
  13. data/examples/singleview/adjustment.rb +97 -0
  14. data/examples/singleview/adjustment_batch.rb +42 -0
  15. data/examples/singleview/adjustment_invoice.rb +17 -0
  16. data/examples/singleview/adjustment_type.rb +54 -0
  17. data/examples/singleview/adjustment_type_variable.rb +8 -0
  18. data/examples/singleview/archive_lock_t.rb +11 -0
  19. data/examples/singleview/archive_result.rb +15 -0
  20. data/examples/singleview/archive_type.rb +31 -0
  21. data/examples/singleview/archive_type_table_list.rb +15 -0
  22. data/examples/singleview/atai_error_name.rb +7 -0
  23. data/examples/singleview/atlanta_form.rb +23 -0
  24. data/examples/singleview/atlanta_form_field.rb +12 -0
  25. data/examples/singleview/atlanta_group.rb +285 -0
  26. data/examples/singleview/atlanta_help_entry.rb +32 -0
  27. data/examples/singleview/atlanta_operator.rb +356 -0
  28. data/examples/singleview/atlanta_profile.rb +47 -0
  29. data/examples/singleview/atlanta_profile_func_map.rb +8 -0
  30. data/examples/singleview/atlanta_profile_group_map.rb +10 -0
  31. data/examples/singleview/atlanta_profile_role_map.rb +8 -0
  32. data/examples/singleview/atlanta_profile_wf_map.rb +10 -0
  33. data/examples/singleview/atlanta_role.rb +23 -0
  34. data/examples/singleview/atlanta_table_partition.rb +39 -0
  35. data/examples/singleview/attribute_type.rb +75 -0
  36. data/examples/singleview/attribute_type_variable.rb +8 -0
  37. data/examples/singleview/bill_run.rb +93 -0
  38. data/examples/singleview/bill_run_operation.rb +54 -0
  39. data/examples/singleview/bill_run_type.rb +39 -0
  40. data/examples/singleview/bill_run_type_status.rb +12 -0
  41. data/examples/singleview/bill_run_type_task.rb +12 -0
  42. data/examples/singleview/cache.rb +23 -0
  43. data/examples/singleview/cache_field.rb +13 -0
  44. data/examples/singleview/can_act_charge.rb +16 -0
  45. data/examples/singleview/charge.rb +67 -0
  46. data/examples/singleview/charge_category.rb +45 -0
  47. data/examples/singleview/charge_output_defn.rb +13 -0
  48. data/examples/singleview/charge_output_defn_history.rb +22 -0
  49. data/examples/singleview/charge_output_defn_var.rb +10 -0
  50. data/examples/singleview/configuration_attr_type.rb +22 -0
  51. data/examples/singleview/configuration_attribute.rb +11 -0
  52. data/examples/singleview/configuration_item.rb +26 -0
  53. data/examples/singleview/configuration_item_type.rb +29 -0
  54. data/examples/singleview/contract.rb +35 -0
  55. data/examples/singleview/contract_history.rb +48 -0
  56. data/examples/singleview/contract_type.rb +58 -0
  57. data/examples/singleview/contract_type_product.rb +11 -0
  58. data/examples/singleview/conversion_rate.rb +14 -0
  59. data/examples/singleview/currency.rb +118 -0
  60. data/examples/singleview/currency_history.rb +28 -0
  61. data/examples/singleview/customer_contact.rb +12 -0
  62. data/examples/singleview/customer_node.rb +166 -0
  63. data/examples/singleview/customer_node_bill_run.rb +12 -0
  64. data/examples/singleview/customer_node_charge_cat.rb +22 -0
  65. data/examples/singleview/customer_node_correspond.rb +12 -0
  66. data/examples/singleview/customer_node_da.rb +11 -0
  67. data/examples/singleview/customer_node_da_array.rb +35 -0
  68. data/examples/singleview/customer_node_history.rb +86 -0
  69. data/examples/singleview/customer_node_inv_format.rb +33 -0
  70. data/examples/singleview/customer_node_type.rb +89 -0
  71. data/examples/singleview/customer_node_type_cc.rb +18 -0
  72. data/examples/singleview/customer_node_type_da.rb +8 -0
  73. data/examples/singleview/customer_node_type_var.rb +8 -0
  74. data/examples/singleview/customer_query.rb +80 -0
  75. data/examples/singleview/customer_query_progress.rb +20 -0
  76. data/examples/singleview/customer_query_type.rb +49 -0
  77. data/examples/singleview/customer_query_type_var.rb +8 -0
  78. data/examples/singleview/delete_cascade.rb +13 -0
  79. data/examples/singleview/delete_cascade_group.rb +21 -0
  80. data/examples/singleview/delete_constraint.rb +9 -0
  81. data/examples/singleview/derived_attribute.rb +32 -0
  82. data/examples/singleview/derived_attribute_array.rb +32 -0
  83. data/examples/singleview/derived_attribute_history.rb +41 -0
  84. data/examples/singleview/derived_attribute_index.rb +13 -0
  85. data/examples/singleview/derived_attribute_value.rb +19 -0
  86. data/examples/singleview/dil.rb +18 -0
  87. data/examples/singleview/dil_history.rb +24 -0
  88. data/examples/singleview/dil_reference.rb +9 -0
  89. data/examples/singleview/dil_validation_t.rb +6 -0
  90. data/examples/singleview/dil_variable.rb +10 -0
  91. data/examples/singleview/dunning_t.rb +14 -0
  92. data/examples/singleview/entity_mapping.rb +11 -0
  93. data/examples/singleview/entity_remap.rb +22 -0
  94. data/examples/singleview/entity_validation.rb +70 -0
  95. data/examples/singleview/entity_validation_list.rb +15 -0
  96. data/examples/singleview/entity_validation_variable.rb +8 -0
  97. data/examples/singleview/equipment.rb +28 -0
  98. data/examples/singleview/equipment_history.rb +62 -0
  99. data/examples/singleview/equipment_type.rb +57 -0
  100. data/examples/singleview/equipment_type_variable.rb +8 -0
  101. data/examples/singleview/error_group.rb +18 -0
  102. data/examples/singleview/error_message.rb +65 -0
  103. data/examples/singleview/evs_address_equiv.rb +17 -0
  104. data/examples/singleview/evs_alias.rb +12 -0
  105. data/examples/singleview/evs_attribute_type_key.rb +7 -0
  106. data/examples/singleview/evt_equipment_changeover.rb +9 -0
  107. data/examples/singleview/expression_list.rb +27 -0
  108. data/examples/singleview/expression_list_value.rb +17 -0
  109. data/examples/singleview/fac_group_compatibility.rb +11 -0
  110. data/examples/singleview/fac_group_instance.rb +19 -0
  111. data/examples/singleview/fac_group_instance_hist.rb +16 -0
  112. data/examples/singleview/facility.rb +9 -0
  113. data/examples/singleview/facility_group.rb +21 -0
  114. data/examples/singleview/facility_group_history.rb +21 -0
  115. data/examples/singleview/foreign_key.rb +9 -0
  116. data/examples/singleview/function_defn.rb +16 -0
  117. data/examples/singleview/function_defn_history.rb +35 -0
  118. data/examples/singleview/function_role.rb +24 -0
  119. data/examples/singleview/function_role_map.rb +10 -0
  120. data/examples/singleview/gl_code.rb +65 -0
  121. data/examples/singleview/gl_code_history.rb +20 -0
  122. data/examples/singleview/gl_upload.rb +10 -0
  123. data/examples/singleview/icon.rb +64 -0
  124. data/examples/singleview/inv_loop_t.rb +4 -0
  125. data/examples/singleview/inv_report_accounts_t.rb +25 -0
  126. data/examples/singleview/invoice.rb +134 -0
  127. data/examples/singleview/invoice_contents.rb +14 -0
  128. data/examples/singleview/invoice_format.rb +31 -0
  129. data/examples/singleview/invoice_format_history.rb +29 -0
  130. data/examples/singleview/invoice_message.rb +17 -0
  131. data/examples/singleview/invoice_message_history.rb +31 -0
  132. data/examples/singleview/invoice_message_variable.rb +10 -0
  133. data/examples/singleview/invoice_receivable_type.rb +13 -0
  134. data/examples/singleview/invoice_type.rb +23 -0
  135. data/examples/singleview/invoice_type_history.rb +26 -0
  136. data/examples/singleview/invoice_type_variable.rb +10 -0
  137. data/examples/singleview/isp_email_address.rb +17 -0
  138. data/examples/singleview/licence_current_values.rb +12 -0
  139. data/examples/singleview/menu_role_map.rb +10 -0
  140. data/examples/singleview/normalised_event.rb +119 -0
  141. data/examples/singleview/normalised_event_error.rb +91 -0
  142. data/examples/singleview/normalised_event_file.rb +75 -0
  143. data/examples/singleview/normalised_event_ft.rb +18 -0
  144. data/examples/singleview/normalised_event_ft_hist.rb +25 -0
  145. data/examples/singleview/normalised_event_ft_var.rb +10 -0
  146. data/examples/singleview/normalised_event_type.rb +54 -0
  147. data/examples/singleview/output_device.rb +37 -0
  148. data/examples/singleview/output_method.rb +32 -0
  149. data/examples/singleview/output_method_type.rb +38 -0
  150. data/examples/singleview/output_select.rb +17 -0
  151. data/examples/singleview/payment.rb +102 -0
  152. data/examples/singleview/payment_batch.rb +43 -0
  153. data/examples/singleview/payment_invoice.rb +17 -0
  154. data/examples/singleview/payment_item.rb +15 -0
  155. data/examples/singleview/payment_type.rb +57 -0
  156. data/examples/singleview/payment_type_variable.rb +8 -0
  157. data/examples/singleview/person.rb +60 -0
  158. data/examples/singleview/person_history.rb +69 -0
  159. data/examples/singleview/person_type.rb +39 -0
  160. data/examples/singleview/plan_table.rb +27 -0
  161. data/examples/singleview/product.rb +45 -0
  162. data/examples/singleview/product_compatibility.rb +13 -0
  163. data/examples/singleview/product_derived_attribute.rb +10 -0
  164. data/examples/singleview/product_facility_group.rb +16 -0
  165. data/examples/singleview/product_group.rb +12 -0
  166. data/examples/singleview/product_group_history.rb +20 -0
  167. data/examples/singleview/product_history.rb +35 -0
  168. data/examples/singleview/product_in_product_group.rb +12 -0
  169. data/examples/singleview/product_instance.rb +41 -0
  170. data/examples/singleview/product_instance_equip.rb +21 -0
  171. data/examples/singleview/product_instance_history.rb +37 -0
  172. data/examples/singleview/product_instance_service.rb +17 -0
  173. data/examples/singleview/product_payment_item.rb +19 -0
  174. data/examples/singleview/product_service_type.rb +32 -0
  175. data/examples/singleview/product_service_type_equip.rb +20 -0
  176. data/examples/singleview/product_subtotal.rb +14 -0
  177. data/examples/singleview/product_tariff.rb +16 -0
  178. data/examples/singleview/racr_clec_t1.rb +12 -0
  179. data/examples/singleview/racr_clec_t2.rb +12 -0
  180. data/examples/singleview/racr_clec_t3.rb +28 -0
  181. data/examples/singleview/racr_t.rb +29 -0
  182. data/examples/singleview/ragd_clec_t.rb +47 -0
  183. data/examples/singleview/ragd_t.rb +28 -0
  184. data/examples/singleview/rapc_t.rb +27 -0
  185. data/examples/singleview/rdfd_cmn_t.rb +17 -0
  186. data/examples/singleview/rdfd_t.rb +16 -0
  187. data/examples/singleview/receivable_type.rb +49 -0
  188. data/examples/singleview/receivable_type_history.rb +25 -0
  189. data/examples/singleview/reference_code.rb +17 -0
  190. data/examples/singleview/reference_type.rb +32 -0
  191. data/examples/singleview/release_info.rb +10 -0
  192. data/examples/singleview/report_reference_type.rb +14 -0
  193. data/examples/singleview/report_reference_type_defs.rb +12 -0
  194. data/examples/singleview/reprocessed_file.rb +32 -0
  195. data/examples/singleview/rgp_file.rb +22 -0
  196. data/examples/singleview/rgp_normalised_event.rb +78 -0
  197. data/examples/singleview/rmag_t.rb +32 -0
  198. data/examples/singleview/rpmr_t.rb +27 -0
  199. data/examples/singleview/rpsi_t.rb +24 -0
  200. data/examples/singleview/rser_t.rb +13 -0
  201. data/examples/singleview/rshu_cmn_t.rb +31 -0
  202. data/examples/singleview/schedule.rb +91 -0
  203. data/examples/singleview/schedule_task_type.rb +43 -0
  204. data/examples/singleview/service.rb +88 -0
  205. data/examples/singleview/service_bill_run_t.rb +12 -0
  206. data/examples/singleview/service_charge_category.rb +22 -0
  207. data/examples/singleview/service_da.rb +11 -0
  208. data/examples/singleview/service_da_array.rb +35 -0
  209. data/examples/singleview/service_duplicate.rb +4 -0
  210. data/examples/singleview/service_history.rb +59 -0
  211. data/examples/singleview/service_type.rb +54 -0
  212. data/examples/singleview/service_type_cc.rb +18 -0
  213. data/examples/singleview/service_type_da.rb +8 -0
  214. data/examples/singleview/service_type_equip_type.rb +11 -0
  215. data/examples/singleview/subtotal.rb +48 -0
  216. data/examples/singleview/subtotal_history.rb +59 -0
  217. data/examples/singleview/subtotal_rating_delta.rb +20 -0
  218. data/examples/singleview/subtotal_rating_value.rb +21 -0
  219. data/examples/singleview/subtotal_term.rb +16 -0
  220. data/examples/singleview/subtotal_value.rb +18 -0
  221. data/examples/singleview/summary_of_change.rb +31 -0
  222. data/examples/singleview/summary_of_change_ev.rb +18 -0
  223. data/examples/singleview/summary_of_change_view.rb +22 -0
  224. data/examples/singleview/t2_anumber_france.rb +22 -0
  225. data/examples/singleview/t2_anumber_italy.rb +22 -0
  226. data/examples/singleview/t2_anumber_netherlands.rb +24 -0
  227. data/examples/singleview/t2_anumber_portugal.rb +22 -0
  228. data/examples/singleview/t2_anumber_spain.rb +22 -0
  229. data/examples/singleview/t2_anumber_switzerland.rb +24 -0
  230. data/examples/singleview/t2_bankreference_austria.rb +7 -0
  231. data/examples/singleview/t2_bankreference_belgium.rb +6 -0
  232. data/examples/singleview/t2_bankreference_france.rb +7 -0
  233. data/examples/singleview/t2_bankreference_germany.rb +7 -0
  234. data/examples/singleview/t2_bankreference_italy.rb +7 -0
  235. data/examples/singleview/t2_bankreference_portugal.rb +7 -0
  236. data/examples/singleview/t2_cc_provrequests.rb +19 -0
  237. data/examples/singleview/t2_emf_info.rb +12 -0
  238. data/examples/singleview/t2_ev_column_label_mapping.rb +9 -0
  239. data/examples/singleview/t2_historytable.rb +26 -0
  240. data/examples/singleview/t2_inv_revoked_invoice.rb +11 -0
  241. data/examples/singleview/t2_inv_suppress_invoice.rb +13 -0
  242. data/examples/singleview/t2_national_number_plan.rb +8 -0
  243. data/examples/singleview/t2_pay_statement.rb +28 -0
  244. data/examples/singleview/t2_prov_req_action.rb +22 -0
  245. data/examples/singleview/t2_prov_request.rb +32 -0
  246. data/examples/singleview/t2_rep_brr_t.rb +19 -0
  247. data/examples/singleview/t2_rep_trr_t.rb +19 -0
  248. data/examples/singleview/t2_rep_ubr_t.rb +19 -0
  249. data/examples/singleview/t2_taxclass.rb +8 -0
  250. data/examples/singleview/t2_zipcode_austria.rb +8 -0
  251. data/examples/singleview/t2_zipcode_france.rb +8 -0
  252. data/examples/singleview/t2_zipcode_germany.rb +8 -0
  253. data/examples/singleview/t2_zipcode_hungary.rb +8 -0
  254. data/examples/singleview/t2_zipcode_luxembourg.rb +8 -0
  255. data/examples/singleview/t2_zipcode_netherlands.rb +8 -0
  256. data/examples/singleview/t2_zipcode_portugal.rb +9 -0
  257. data/examples/singleview/t2_zipcode_spain.rb +8 -0
  258. data/examples/singleview/t2_zipcode_switzerland.rb +8 -0
  259. data/examples/singleview/table_import_order.rb +6 -0
  260. data/examples/singleview/tariff.rb +51 -0
  261. data/examples/singleview/tariff_charge.rb +33 -0
  262. data/examples/singleview/tariff_charge_defn.rb +18 -0
  263. data/examples/singleview/tariff_condition_defn.rb +19 -0
  264. data/examples/singleview/tariff_history.rb +70 -0
  265. data/examples/singleview/tariff_recurring.rb +36 -0
  266. data/examples/singleview/task_queue.rb +130 -0
  267. data/examples/singleview/task_queue_result.rb +10 -0
  268. data/examples/singleview/template.rb +18 -0
  269. data/examples/singleview/template_history.rb +30 -0
  270. data/examples/singleview/template_reference.rb +9 -0
  271. data/examples/singleview/template_variable.rb +10 -0
  272. data/examples/singleview/trt_clec_treatment.rb +13 -0
  273. data/examples/singleview/variable_defn.rb +48 -0
  274. data/examples/singleview/variable_defn_dependency.rb +11 -0
  275. data/examples/singleview/variable_defn_direct.rb +15 -0
  276. data/examples/singleview/variable_defn_history.rb +22 -0
  277. data/examples/singleview/work_force.rb +25 -0
  278. data/examples/singleview/xpsi_addr_val_commtax21.rb +24 -0
  279. data/examples/singleview/xpsi_addr_val_msag.rb +24 -0
  280. data/examples/singleview/xpsi_addr_val_zip.rb +14 -0
  281. data/examples/singleview/xpsi_ne_batch.rb +20 -0
  282. data/examples/singleview/xpsi_product_batch.rb +18 -0
  283. data/examples/singleview/xpsi_product_status.rb +14 -0
  284. data/examples/singleview/xpsi_tax_error.rb +34 -0
  285. data/examples/singleview/xpsi_trt_revoke.rb +68 -0
  286. data/examples/singleview/xpsi_trt_revoke_prod_inst.rb +12 -0
  287. data/examples/singleview/xpsi_update_capture.rb +35 -0
  288. data/lib/activerecord/base.rb +12 -0
  289. data/lib/hash_tricks.rb +21 -0
  290. data/lib/magic_model_generator.rb +8 -0
  291. data/lib/magic_model_generator/schema.rb +205 -0
  292. data/lib/magic_model_generator/validations.rb +48 -0
  293. data/lib/magic_model_generator/version.rb +9 -0
  294. data/lib/rails/generator/dynamic_named_base.rb +99 -0
  295. data/lib/rails/generator/manifest.rb +8 -0
  296. data/magic_model_generator.rb +88 -0
  297. data/templates/model.rb +3 -0
  298. data/test/magic_model_generator_test.rb +11 -0
  299. data/test/test_helper.rb +2 -0
  300. metadata +366 -0
@@ -0,0 +1,11 @@
1
+ class VariableDefnDependency < ActiveRecord::Base
2
+ belongs_to :variable_defn, :class_name => 'VariableDefn', :foreign_key => :variable_defn_id
3
+ validates_presence_of :variable_defn_id
4
+ validates_numericality_of :variable_defn_id, :allow_nil => false, :only_integer => true
5
+ validates_presence_of :effective_start_date
6
+ validates_presence_of :effective_end_date
7
+ validates_presence_of :dependent_variable_defn_id
8
+ validates_numericality_of :dependent_variable_defn_id, :allow_nil => false, :only_integer => true
9
+ validates_presence_of :dependency_count
10
+ validates_numericality_of :dependency_count, :allow_nil => false, :only_integer => true
11
+ end
@@ -0,0 +1,15 @@
1
+ class VariableDefnDirect < ActiveRecord::Base
2
+ belongs_to :variable_defn, :class_name => 'VariableDefn', :foreign_key => :variable_defn_id
3
+ validates_presence_of :variable_defn_id
4
+ validates_numericality_of :variable_defn_id, :allow_nil => false, :only_integer => true
5
+ validates_presence_of :effective_start_date
6
+ validates_presence_of :effective_end_date
7
+ validates_presence_of :last_modified
8
+ validates_presence_of :view_name
9
+ validates_length_of :view_name, :allow_nil => false, :maximum => 30
10
+ validates_presence_of :column_name
11
+ validates_length_of :column_name, :allow_nil => false, :maximum => 30
12
+ validates_presence_of :column_nr
13
+ validates_numericality_of :column_nr, :allow_nil => false, :only_integer => true
14
+ validates_length_of :description, :allow_nil => true, :maximum => 255
15
+ end
@@ -0,0 +1,22 @@
1
+ class VariableDefnHistory < ActiveRecord::Base
2
+ belongs_to :variable_defn, :class_name => 'VariableDefn', :foreign_key => :variable_defn_id
3
+ belongs_to :atlanta_operator, :class_name => 'AtlantaOperator', :foreign_key => :atlanta_operator_id
4
+ belongs_to :atlanta_group, :class_name => 'AtlantaGroup', :foreign_key => :atlanta_group_id
5
+ validates_presence_of :variable_defn_id
6
+ validates_numericality_of :variable_defn_id, :allow_nil => false, :only_integer => true
7
+ validates_presence_of :variable_defn_name
8
+ validates_length_of :variable_defn_name, :allow_nil => false, :maximum => 73
9
+ validates_presence_of :last_modified
10
+ validates_numericality_of :atlanta_operator_id, :allow_nil => true, :only_integer => true
11
+ validates_numericality_of :atlanta_group_id, :allow_nil => true, :only_integer => true
12
+ validates_presence_of :effective_start_date
13
+ validates_presence_of :effective_end_date
14
+ validates_presence_of :data_type_code
15
+ validates_numericality_of :data_type_code, :allow_nil => false, :only_integer => true
16
+ validates_presence_of :variable_type_code
17
+ validates_numericality_of :variable_type_code, :allow_nil => false, :only_integer => true
18
+ validates_presence_of :context_code
19
+ validates_numericality_of :context_code, :allow_nil => false, :only_integer => true
20
+ validates_presence_of :application_env_code
21
+ validates_numericality_of :application_env_code, :allow_nil => false, :only_integer => true
22
+ end
@@ -0,0 +1,25 @@
1
+ class WorkForce < ActiveRecord::Base
2
+ belongs_to :work_force, :class_name => 'WorkForce', :foreign_key => :work_force_id
3
+ belongs_to :atlanta_operator, :class_name => 'AtlantaOperator', :foreign_key => :atlanta_operator_id
4
+ belongs_to :atlanta_group, :class_name => 'AtlantaGroup', :foreign_key => :atlanta_group_id
5
+ has_many :atlanta_profile_wf_maps, :class_name => 'AtlantaProfileWfMap', :foreign_key => :work_force_id
6
+ has_many :customer_query_progresses, :class_name => 'CustomerQueryProgress', :foreign_key => :work_force_id
7
+ has_many :work_forces, :class_name => 'WorkForce', :foreign_key => :work_force_id
8
+ has_many :atlanta_profiles, :through => atlanta_profile_wf_maps
9
+ has_many :customer_queries, :through => customer_query_progresses
10
+ has_many :atlanta_operators, :through => customer_query_progresses
11
+ has_many :atlanta_groups, :through => work_forces
12
+ has_many :atlanta_operators, :through => work_forces
13
+ validates_presence_of :work_force_id
14
+ validates_numericality_of :work_force_id, :allow_nil => false, :only_integer => true
15
+ validates_presence_of :work_force_name
16
+ validates_length_of :work_force_name, :allow_nil => false, :maximum => 30
17
+ validates_presence_of :description
18
+ validates_length_of :description, :allow_nil => false, :maximum => 255
19
+ validates_presence_of :last_modified
20
+ validates_presence_of :atlanta_operator_id
21
+ validates_numericality_of :atlanta_operator_id, :allow_nil => false, :only_integer => true
22
+ validates_presence_of :atlanta_group_id
23
+ validates_numericality_of :atlanta_group_id, :allow_nil => false, :only_integer => true
24
+ validates_length_of :version_str, :allow_nil => true, :maximum => 255
25
+ end
@@ -0,0 +1,24 @@
1
+ class XpsiAddrValCommtax21 < ActiveRecord::Base
2
+ validates_presence_of :state_abbrev
3
+ validates_length_of :state_abbrev, :allow_nil => false, :maximum => 2
4
+ validates_presence_of :county_name_uppercase
5
+ validates_length_of :county_name_uppercase, :allow_nil => false, :maximum => 15
6
+ validates_presence_of :city_name_uppercase
7
+ validates_length_of :city_name_uppercase, :allow_nil => false, :maximum => 25
8
+ validates_presence_of :zip_begin
9
+ validates_length_of :zip_begin, :allow_nil => false, :maximum => 5
10
+ validates_presence_of :zip_end
11
+ validates_length_of :zip_end, :allow_nil => false, :maximum => 5
12
+ validates_presence_of :seqnr
13
+ validates_numericality_of :seqnr, :allow_nil => false, :only_integer => true
14
+ validates_presence_of :geocode
15
+ validates_length_of :geocode, :allow_nil => false, :maximum => 12
16
+ validates_presence_of :authority_code
17
+ validates_numericality_of :authority_code, :allow_nil => false, :only_integer => true
18
+ validates_presence_of :state_name
19
+ validates_length_of :state_name, :allow_nil => false, :maximum => 20
20
+ validates_presence_of :county_name
21
+ validates_length_of :county_name, :allow_nil => false, :maximum => 15
22
+ validates_presence_of :city_name
23
+ validates_length_of :city_name, :allow_nil => false, :maximum => 25
24
+ end
@@ -0,0 +1,24 @@
1
+ class XpsiAddrValMsag < ActiveRecord::Base
2
+ validates_presence_of :street_name_uppercase
3
+ validates_length_of :street_name_uppercase, :allow_nil => false, :maximum => 48
4
+ validates_presence_of :community_name_uppercase
5
+ validates_length_of :community_name_uppercase, :allow_nil => false, :maximum => 32
6
+ validates_presence_of :state_abbrev
7
+ validates_length_of :state_abbrev, :allow_nil => false, :maximum => 2
8
+ validates_presence_of :low_number
9
+ validates_length_of :low_number, :allow_nil => false, :maximum => 8
10
+ validates_presence_of :high_number
11
+ validates_length_of :high_number, :allow_nil => false, :maximum => 8
12
+ validates_presence_of :seqnr
13
+ validates_numericality_of :seqnr, :allow_nil => false, :only_integer => true
14
+ validates_length_of :prefix_dir, :allow_nil => true, :maximum => 2
15
+ validates_length_of :postfix_dir, :allow_nil => true, :maximum => 2
16
+ validates_presence_of :street_name
17
+ validates_length_of :street_name, :allow_nil => false, :maximum => 48
18
+ validates_length_of :street_suffix, :allow_nil => true, :maximum => 8
19
+ validates_length_of :odd_even_ind, :allow_nil => true, :maximum => 1
20
+ validates_presence_of :community_name
21
+ validates_length_of :community_name, :allow_nil => false, :maximum => 32
22
+ validates_length_of :esn, :allow_nil => true, :maximum => 5
23
+ validates_length_of :exchange, :allow_nil => true, :maximum => 4
24
+ end
@@ -0,0 +1,14 @@
1
+ class XpsiAddrValZip < ActiveRecord::Base
2
+ validates_presence_of :state_abbrev
3
+ validates_length_of :state_abbrev, :allow_nil => false, :maximum => 2
4
+ validates_presence_of :county_name_uppercase
5
+ validates_length_of :county_name_uppercase, :allow_nil => false, :maximum => 15
6
+ validates_presence_of :city_name_uppercase
7
+ validates_length_of :city_name_uppercase, :allow_nil => false, :maximum => 25
8
+ validates_presence_of :zip_begin
9
+ validates_length_of :zip_begin, :allow_nil => false, :maximum => 5
10
+ validates_presence_of :zip_end
11
+ validates_length_of :zip_end, :allow_nil => false, :maximum => 5
12
+ validates_presence_of :seqnr
13
+ validates_numericality_of :seqnr, :allow_nil => false, :only_integer => true
14
+ end
@@ -0,0 +1,20 @@
1
+ class XpsiNeBatch < ActiveRecord::Base
2
+ belongs_to :xpsi_ne_batch, :class_name => 'XpsiNeBatch', :foreign_key => :xpsi_ne_batch_id
3
+ belongs_to :error_message, :class_name => 'ErrorMessage', :foreign_key => :error_message_id
4
+ has_many :xpsi_ne_batches, :class_name => 'XpsiNeBatch', :foreign_key => :xpsi_ne_batch_id
5
+ has_many :error_messages, :through => xpsi_ne_batches
6
+ validates_presence_of :xpsi_ne_batch_id
7
+ validates_numericality_of :xpsi_ne_batch_id, :allow_nil => false, :only_integer => true
8
+ validates_presence_of :source
9
+ validates_length_of :source, :allow_nil => false, :maximum => 80
10
+ validates_presence_of :create_date
11
+ validates_numericality_of :sequence_number, :allow_nil => true, :only_integer => true
12
+ validates_presence_of :ne_filename
13
+ validates_length_of :ne_filename, :allow_nil => false, :maximum => 255
14
+ validates_numericality_of :error_message_id, :allow_nil => true, :only_integer => true
15
+ validates_length_of :error_message, :allow_nil => true, :maximum => 255
16
+ validates_presence_of :revoke_ind_code
17
+ validates_numericality_of :revoke_ind_code, :allow_nil => false, :only_integer => true
18
+ validates_presence_of :event_count
19
+ validates_numericality_of :event_count, :allow_nil => false, :only_integer => true
20
+ end
@@ -0,0 +1,18 @@
1
+ class XpsiProductBatch < ActiveRecord::Base
2
+ belongs_to :product_instance, :class_name => 'ProductInstance', :foreign_key => :product_instance_id
3
+ validates_presence_of :product_instance_id
4
+ validates_numericality_of :product_instance_id, :allow_nil => false, :only_integer => true
5
+ validates_presence_of :effective_date
6
+ validates_presence_of :entity_type
7
+ validates_length_of :entity_type, :allow_nil => false, :maximum => 255
8
+ validates_presence_of :entity_id
9
+ validates_numericality_of :entity_id, :allow_nil => false, :only_integer => true
10
+ validates_numericality_of :svcda_id, :allow_nil => true, :only_integer => true
11
+ validates_numericality_of :seq_nr, :allow_nil => true, :only_integer => true
12
+ validates_presence_of :entity_status
13
+ validates_numericality_of :entity_status, :allow_nil => false, :only_integer => true
14
+ validates_numericality_of :old_entity_status, :allow_nil => true, :only_integer => true
15
+ validates_presence_of :entity_action
16
+ validates_numericality_of :entity_action, :allow_nil => false, :only_integer => true
17
+ validates_length_of :addn_info, :allow_nil => true, :maximum => 1999
18
+ end
@@ -0,0 +1,14 @@
1
+ class XpsiProductStatus < ActiveRecord::Base
2
+ belongs_to :product_instance, :class_name => 'ProductInstance', :foreign_key => :product_instance_id
3
+ validates_presence_of :product_instance_id
4
+ validates_numericality_of :product_instance_id, :allow_nil => false, :only_integer => true
5
+ validates_presence_of :effective_date
6
+ validates_presence_of :entity_type
7
+ validates_length_of :entity_type, :allow_nil => false, :maximum => 255
8
+ validates_presence_of :entity_id
9
+ validates_numericality_of :entity_id, :allow_nil => false, :only_integer => true
10
+ validates_numericality_of :svcda_id, :allow_nil => true, :only_integer => true
11
+ validates_numericality_of :seq_nr, :allow_nil => true, :only_integer => true
12
+ validates_presence_of :entity_status
13
+ validates_numericality_of :entity_status, :allow_nil => false, :only_integer => true
14
+ end
@@ -0,0 +1,34 @@
1
+ class XpsiTaxError < ActiveRecord::Base
2
+ belongs_to :xpsi_tax_error, :class_name => 'XpsiTaxError', :foreign_key => :xpsi_tax_error_id
3
+ belongs_to :normalised_event, :class_name => 'NormalisedEvent', :foreign_key => :normalised_event_id
4
+ belongs_to :service, :class_name => 'Service', :foreign_key => :service_id
5
+ belongs_to :customer_node, :class_name => 'CustomerNode', :foreign_key => :customer_node_id
6
+ belongs_to :error_message, :class_name => 'ErrorMessage', :foreign_key => :error_message_id
7
+ belongs_to :adjustment, :class_name => 'Adjustment', :foreign_key => :adjustment_id
8
+ has_many :xpsi_tax_errors, :class_name => 'XpsiTaxError', :foreign_key => :xpsi_tax_error_id
9
+ has_many :customer_nodes, :through => xpsi_tax_errors
10
+ has_many :adjustments, :through => xpsi_tax_errors
11
+ has_many :error_messages, :through => xpsi_tax_errors
12
+ has_many :services, :through => xpsi_tax_errors
13
+ has_many :normalised_events, :through => xpsi_tax_errors
14
+ validates_presence_of :xpsi_tax_error_id
15
+ validates_numericality_of :xpsi_tax_error_id, :allow_nil => false, :only_integer => true
16
+ validates_presence_of :normalised_event_id
17
+ validates_numericality_of :normalised_event_id, :allow_nil => false, :only_integer => true
18
+ validates_numericality_of :service_id, :allow_nil => true, :only_integer => true
19
+ validates_numericality_of :customer_node_id, :allow_nil => true, :only_integer => true
20
+ validates_presence_of :tax_module_code
21
+ validates_numericality_of :tax_module_code, :allow_nil => false, :only_integer => true
22
+ validates_length_of :tax_module_return_value, :allow_nil => true, :maximum => 40
23
+ validates_numericality_of :tax_type_code, :allow_nil => true, :only_integer => true
24
+ validates_length_of :tax_key, :allow_nil => true, :maximum => 255
25
+ validates_numericality_of :amount, :allow_nil => true
26
+ validates_presence_of :adjust_ind
27
+ validates_numericality_of :adjust_ind, :allow_nil => false, :only_integer => true
28
+ validates_presence_of :error_message_id
29
+ validates_numericality_of :error_message_id, :allow_nil => false, :only_integer => true
30
+ validates_presence_of :error_message
31
+ validates_length_of :error_message, :allow_nil => false, :maximum => 255
32
+ validates_numericality_of :adjustment_id, :allow_nil => true, :only_integer => true
33
+ validates_presence_of :error_date
34
+ end
@@ -0,0 +1,68 @@
1
+ class XpsiTrtRevoke < ActiveRecord::Base
2
+ belongs_to :adjustment, :class_name => 'Adjustment', :foreign_key => :adjustment_id
3
+ validates_presence_of :task_id
4
+ validates_numericality_of :task_id, :allow_nil => false, :only_integer => true
5
+ validates_presence_of :effective_date
6
+ validates_presence_of :cq_customer_query_id
7
+ validates_numericality_of :cq_customer_query_id, :allow_nil => false, :only_integer => true
8
+ validates_presence_of :qp_progress_seqnr
9
+ validates_numericality_of :qp_progress_seqnr, :allow_nil => false, :only_integer => true
10
+ validates_length_of :revoke_function, :allow_nil => true, :maximum => 255
11
+ validates_numericality_of :letter_type, :allow_nil => true, :only_integer => true
12
+ validates_length_of :products_suspended, :allow_nil => true, :maximum => 255
13
+ validates_numericality_of :adjustment_id, :allow_nil => true, :only_integer => true
14
+ validates_length_of :general_1, :allow_nil => true, :maximum => 255
15
+ validates_length_of :general_2, :allow_nil => true, :maximum => 255
16
+ validates_length_of :general_3, :allow_nil => true, :maximum => 255
17
+ validates_length_of :general_4, :allow_nil => true, :maximum => 255
18
+ validates_length_of :general_5, :allow_nil => true, :maximum => 255
19
+ validates_length_of :general_6, :allow_nil => true, :maximum => 255
20
+ validates_length_of :general_7, :allow_nil => true, :maximum => 255
21
+ validates_length_of :general_8, :allow_nil => true, :maximum => 255
22
+ validates_length_of :general_9, :allow_nil => true, :maximum => 255
23
+ validates_length_of :general_10, :allow_nil => true, :maximum => 255
24
+ validates_presence_of :cq_last_modified
25
+ validates_numericality_of :cq_customer_node_id, :allow_nil => true, :only_integer => true
26
+ validates_presence_of :cq_atlanta_group_id
27
+ validates_numericality_of :cq_atlanta_group_id, :allow_nil => false, :only_integer => true
28
+ validates_presence_of :cq_atlanta_operator_id
29
+ validates_numericality_of :cq_atlanta_operator_id, :allow_nil => false, :only_integer => true
30
+ validates_presence_of :cq_query_status_code
31
+ validates_numericality_of :cq_query_status_code, :allow_nil => false, :only_integer => true
32
+ validates_numericality_of :cq_query_resolution_code, :allow_nil => true, :only_integer => true
33
+ validates_numericality_of :cq_query_work_force_id, :allow_nil => true, :only_integer => true
34
+ validates_numericality_of :cq_progress_seqnr, :allow_nil => true, :only_integer => true
35
+ validates_presence_of :cq_open_date
36
+ validates_presence_of :cq_response_due_date
37
+ validates_presence_of :cq_next_callback_date
38
+ validates_presence_of :cq_resolution_due_date
39
+ validates_length_of :cq_query_text, :allow_nil => true, :maximum => 2000
40
+ validates_length_of :cq_resolution_text, :allow_nil => true, :maximum => 2000
41
+ validates_length_of :cq_general_1, :allow_nil => true, :maximum => 255
42
+ validates_length_of :cq_general_2, :allow_nil => true, :maximum => 255
43
+ validates_length_of :cq_general_3, :allow_nil => true, :maximum => 255
44
+ validates_length_of :cq_general_4, :allow_nil => true, :maximum => 255
45
+ validates_length_of :cq_general_5, :allow_nil => true, :maximum => 255
46
+ validates_length_of :cq_general_6, :allow_nil => true, :maximum => 255
47
+ validates_length_of :cq_general_7, :allow_nil => true, :maximum => 255
48
+ validates_length_of :cq_general_8, :allow_nil => true, :maximum => 255
49
+ validates_length_of :cq_general_9, :allow_nil => true, :maximum => 255
50
+ validates_length_of :cq_general_10, :allow_nil => true, :maximum => 255
51
+ validates_presence_of :qp_last_modified
52
+ validates_numericality_of :qp_open_query_ind_code, :allow_nil => true, :only_integer => true
53
+ validates_presence_of :qp_work_force_id
54
+ validates_numericality_of :qp_work_force_id, :allow_nil => false, :only_integer => true
55
+ validates_presence_of :qp_open_date
56
+ validates_presence_of :qp_response_due_date
57
+ validates_length_of :qp_progress_text, :allow_nil => true, :maximum => 2000
58
+ validates_length_of :qp_action_text, :allow_nil => true, :maximum => 2000
59
+ validates_presence_of :qp_atlanta_operator_id
60
+ validates_numericality_of :qp_atlanta_operator_id, :allow_nil => false, :only_integer => true
61
+ validates_length_of :qp_resolution_text, :allow_nil => true, :maximum => 2000
62
+ validates_length_of :cda_index1_value, :allow_nil => true, :maximum => 255
63
+ validates_length_of :cda_result1_value, :allow_nil => true, :maximum => 255
64
+ validates_length_of :cda_result2_value, :allow_nil => true, :maximum => 255
65
+ validates_length_of :cda_result3_value, :allow_nil => true, :maximum => 255
66
+ validates_length_of :cda_result4_value, :allow_nil => true, :maximum => 255
67
+ validates_length_of :cda_result5_value, :allow_nil => true, :maximum => 255
68
+ end
@@ -0,0 +1,12 @@
1
+ class XpsiTrtRevokeProdInst < ActiveRecord::Base
2
+ belongs_to :product_instance, :class_name => 'ProductInstance', :foreign_key => :product_instance_id
3
+ validates_presence_of :task_id
4
+ validates_numericality_of :task_id, :allow_nil => false, :only_integer => true
5
+ validates_presence_of :effective_date
6
+ validates_presence_of :cq_customer_query_id
7
+ validates_numericality_of :cq_customer_query_id, :allow_nil => false, :only_integer => true
8
+ validates_presence_of :qp_progress_seqnr
9
+ validates_numericality_of :qp_progress_seqnr, :allow_nil => false, :only_integer => true
10
+ validates_presence_of :product_instance_id
11
+ validates_numericality_of :product_instance_id, :allow_nil => false, :only_integer => true
12
+ end
@@ -0,0 +1,35 @@
1
+ class XpsiUpdateCapture < ActiveRecord::Base
2
+ belongs_to :xpsi_update_capture, :class_name => 'XpsiUpdateCapture', :foreign_key => :xpsi_update_capture_id
3
+ belongs_to :task_queue, :class_name => 'TaskQueue', :foreign_key => :task_queue_id
4
+ has_many :xpsi_update_captures, :class_name => 'XpsiUpdateCapture', :foreign_key => :xpsi_update_capture_id
5
+ has_many :task_queues, :through => xpsi_update_captures
6
+ validates_presence_of :xpsi_update_capture_id
7
+ validates_numericality_of :xpsi_update_capture_id, :allow_nil => false, :only_integer => true
8
+ validates_presence_of :capture_type_code
9
+ validates_numericality_of :capture_type_code, :allow_nil => false, :only_integer => true
10
+ validates_presence_of :last_modified
11
+ validates_presence_of :effective_extract_date
12
+ validates_presence_of :seqnr
13
+ validates_numericality_of :seqnr, :allow_nil => false, :only_integer => true
14
+ validates_numericality_of :task_queue_id, :allow_nil => true, :only_integer => true
15
+ validates_length_of :general_1, :allow_nil => true, :maximum => 255
16
+ validates_length_of :general_2, :allow_nil => true, :maximum => 255
17
+ validates_length_of :general_3, :allow_nil => true, :maximum => 255
18
+ validates_length_of :general_4, :allow_nil => true, :maximum => 255
19
+ validates_length_of :general_5, :allow_nil => true, :maximum => 255
20
+ validates_length_of :general_6, :allow_nil => true, :maximum => 255
21
+ validates_length_of :general_7, :allow_nil => true, :maximum => 255
22
+ validates_length_of :general_8, :allow_nil => true, :maximum => 255
23
+ validates_length_of :general_9, :allow_nil => true, :maximum => 255
24
+ validates_length_of :general_10, :allow_nil => true, :maximum => 255
25
+ validates_length_of :general_11, :allow_nil => true, :maximum => 255
26
+ validates_length_of :general_12, :allow_nil => true, :maximum => 255
27
+ validates_length_of :general_13, :allow_nil => true, :maximum => 255
28
+ validates_length_of :general_14, :allow_nil => true, :maximum => 255
29
+ validates_length_of :general_15, :allow_nil => true, :maximum => 255
30
+ validates_length_of :general_16, :allow_nil => true, :maximum => 255
31
+ validates_length_of :general_17, :allow_nil => true, :maximum => 255
32
+ validates_length_of :general_18, :allow_nil => true, :maximum => 255
33
+ validates_length_of :general_19, :allow_nil => true, :maximum => 255
34
+ validates_length_of :general_20, :allow_nil => true, :maximum => 255
35
+ end
@@ -0,0 +1,12 @@
1
+ #TODO: Use :dependent for FK cascade?
2
+
3
+ module ActiveRecord
4
+ class Base
5
+ class << self
6
+ public
7
+ def get_unique_index_columns
8
+ self.connection.indexes(self.table_name, "#{self.name} Indexes").select { |index| index.unique && index.columns.size == 1 }.map{ |index| index.columns.first }
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ class Hash
2
+ # lets through the keys in the argument
3
+ # >> {:one => 1, :two => 2, :three => 3}.pass(:one)
4
+ # => {:one=>1}
5
+ def pass(*keys)
6
+ tmp = self.clone
7
+ keys = keys[0] if keys[0].is_a? Array
8
+ tmp.delete_if {|k,v| ! keys.include?(k) }
9
+ tmp
10
+ end
11
+
12
+ def merge_with_prefix(prefix, hash)
13
+ merged = clone
14
+ hash.each {|key, value| merged.merge!("#{prefix}_#{key}" => value)}
15
+ merged
16
+ end
17
+
18
+ def merge_with_prefix!(prefix, hash)
19
+ hash.each {|key, value| merge!("#{prefix}_#{key}" => value)}
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ module MagicModelsGenerator
2
+ def self.logger; @@logger ||= RAILS_DEFAULT_LOGGER rescue Logger.new(STDERR); end
3
+ end
4
+
5
+ Dir[File.join(File.dirname(__FILE__), '**/*.rb')].sort.each { |lib| require lib }
6
+
7
+
8
+ #require 'magic_model_generator/validations'
@@ -0,0 +1,205 @@
1
+ require 'pp'
2
+ module MagicModelsGenerator
3
+
4
+ class Schema
5
+ class << self
6
+ cattr_accessor :superklass,
7
+ :belongs_to_associations,
8
+ :has_some_associations,
9
+ :has_many_through_associations
10
+
11
+ @@models = nil
12
+
13
+ def logger
14
+ @@logger ||= MagicModelsGenerator.logger
15
+ end
16
+
17
+ def models
18
+ load_schema if @@models.nil?
19
+ @@models
20
+ end
21
+
22
+ def tables
23
+ load_schema if @@tables.nil?
24
+ @@tables
25
+ end
26
+
27
+ def table_names
28
+ load_schema if @@table_names.nil?
29
+ @@table_names
30
+ end
31
+
32
+ def fks_on_table(table_name)
33
+ load_schema if @@models.nil?
34
+ @@fks_by_table[table_name.to_s] || []
35
+ end
36
+
37
+ # active record only support 2 column link tables, otherwise use a model table, has_many and through
38
+ def is_link_table?(table_name)
39
+ load_schema if @@models.nil?
40
+ return @@link_tables[table_name] if ! @@link_tables[table_name].nil?
41
+ column_names = @conn.columns(table_name).map{|x| x.name }
42
+ @@link_tables[table_name] = ! column_names.include?("id") && column_names.length == 2 && column_names.select { |x| x =~ /_id$/ } == column_names
43
+ return @@link_tables[table_name]
44
+ end
45
+
46
+ def link_tables_for_class(klass)
47
+ load_schema if @@models.nil?
48
+ end
49
+
50
+ def load_schema
51
+ return if ! @@models.nil?
52
+ @@superklass ||= ActiveRecord::Base
53
+ raise "No database connection" if !(@conn = @@superklass.connection)
54
+
55
+ @@models = ModelHash.new
56
+ @@tables = Hash.new
57
+ @@fks_by_table = Hash.new
58
+ @@link_tables = Hash.new
59
+ @@belongs_to_associations = Hash.new
60
+ @@has_some_associations = Hash.new
61
+ @@has_many_through_associations = Hash.new
62
+
63
+ @@table_names = @conn.tables.sort
64
+
65
+ # Work out which tables are in the model and which aren't
66
+ @@table_names.each do |table_name|
67
+
68
+ # a model table then...
69
+ model_class_name = ActiveRecord::Base.class_name(table_name)
70
+ logger.debug "Got a model table: #{table_name} => class #{model_class_name}"
71
+
72
+ @@models[model_class_name] = table_name
73
+ @@tables[table_name] = model_class_name
74
+
75
+ # Process FKs?
76
+ if @conn.supports_fetch_foreign_keys?
77
+ table_names.each do |table_name|
78
+ logger.debug "Getting FKs for #{table_name}"
79
+ @@fks_by_table[table_name] = Array.new
80
+ @conn.foreign_key_constraints(table_name).each do |fk|
81
+ logger.debug "Got one: #{fk}"
82
+ @@fks_by_table[table_name].push(fk)
83
+ end # do each fk
84
+ end # each table
85
+ end
86
+
87
+ # Try to work out our link tables now...
88
+ #@@models.keys.sort.each{|klass| process_table(@@models[klass.to_s])}
89
+ #@@link_tables.keys.sort.each{|table_name| process_link_table(table_name) if @@link_tables[table_name]}
90
+ end
91
+
92
+ models.each do |model_name, table_name|
93
+ @@belongs_to_associations[model_name] = []
94
+ @@has_some_associations[model_name] = []
95
+ @@has_many_through_associations[model_name] = []
96
+ end
97
+
98
+ logger.debug "Loaded all models, now generating associations..."
99
+
100
+ models.keys.sort.each do |model_name|
101
+ puts "Generating for #{model_name}..."
102
+ table_name = models[model_name]
103
+ generate_associations(model_name, table_name)
104
+ end
105
+
106
+ end
107
+
108
+ # Used by the generator to access the association code lines for the generated class
109
+ def associations(klass)
110
+ @@belongs_to_associations[klass.to_s] +
111
+ @@has_some_associations[klass.to_s] +
112
+ @@has_many_through_associations[klass.to_s]
113
+ end
114
+
115
+ protected
116
+ def generate_associations(model_name, table_name)
117
+ belongs_to_klass = model_name.constantize rescue return
118
+ logger.debug "Processing model table #{table_name}"
119
+
120
+ processed_columns = Hash.new
121
+
122
+ # ok, so let's look at the foreign keys on the table...
123
+
124
+ fks_on_table(table_name).each do |fk|
125
+ logger.debug "Found FK column by suffix _id [#{fk.foreign_key}]"
126
+ has_some_klass = Inflector.classify(fk.reference_table).constantize rescue next
127
+ processed_columns[fk.foreign_key] = { :has_some_klass => has_some_klass }
128
+ processed_columns[fk.foreign_key].merge! add_has_some_belongs_to(belongs_to_klass, fk.foreign_key, has_some_klass) rescue next
129
+ end
130
+
131
+ column_names = @conn.columns(table_name).map{ |x| x.name}
132
+ column_names.each do |column_name|
133
+ next if not column_name =~ /_id$/
134
+ logger.debug "Found FK column by suffix _id [#{column_name}]"
135
+ if processed_columns.key?(column_name)
136
+ logger.debug "Skipping, already processed"
137
+ next
138
+ end
139
+ has_some_klass = Inflector.classify(column_name.sub(/_id$/,"")).constantize rescue next
140
+ processed_columns[column_name] = { :has_some_klass => has_some_klass }
141
+ begin
142
+ processed_columns[column_name].merge! add_has_some_belongs_to(belongs_to_klass, column_name, has_some_klass)
143
+ rescue
144
+ puts $!
145
+ next
146
+ end
147
+ end
148
+
149
+ # is this a link table with attributes? (has_many through?)
150
+ return if processed_columns.keys.length < 2
151
+
152
+ processed_columns.keys.each do |key1|
153
+ processed_columns.keys.each do |key2|
154
+ next if key1 == key2
155
+ has_some_class = processed_columns[key1][:has_some_class].to_s
156
+ @@has_many_through_associations[has_some_class] <<
157
+ "has_many :#{processed_columns[key2][:belongs_to_name].to_s.pluralize.to_sym}, :through => :#{processed_columns[key2][:has_some_name]}"
158
+ logger.debug @@has_many_through_associations[has_some_class].last
159
+ end
160
+ end
161
+ end
162
+
163
+ def add_has_some_belongs_to(belongs_to_klass, belongs_to_fk, has_some_klass)
164
+ logger.debug "Trying to add a #{belongs_to_klass} belongs_to #{has_some_klass}..."
165
+
166
+ # so this is a belongs_to & has_some style relationship...
167
+ # is it a has_many, or a has_one? Well, let's assume a has_one has a unique index on the column please... good db design, haha!
168
+ unique = belongs_to_klass.get_unique_index_columns.include?(belongs_to_fk)
169
+ belongs_to_name = belongs_to_fk.sub(/_id$/, '').to_sym
170
+ @@belongs_to_associations[belongs_to_klass.to_s] << "belongs_to :#{belongs_to_name}, :class_name => '#{has_some_klass}', :foreign_key => :#{belongs_to_fk.to_sym}"
171
+ logger.debug @@belongs_to_associations[belongs_to_klass.to_s].last
172
+
173
+ # work out if we need a prefix
174
+ has_some_name = ((unique ? belongs_to_klass.table_name.singularize : belongs_to_klass.table_name.pluralize) + (belongs_to_name.to_s == has_some_klass.table_name.singularize ? "" : "_as_"+belongs_to_name.to_s)).downcase.to_sym
175
+ method = unique ? :has_one : :has_many
176
+ @@has_some_associations[has_some_klass.to_s] << "#{method} :#{has_some_name}, :class_name => '#{belongs_to_klass.to_s}', :foreign_key => :#{belongs_to_fk.to_sym}"
177
+ logger.debug @@has_some_associations[has_some_klass.to_s].last
178
+
179
+ return { :method => method,
180
+ :belongs_to_name => belongs_to_name,
181
+ :has_some_name => has_some_name,
182
+ :has_some_class => has_some_klass }
183
+ end
184
+
185
+ end
186
+ end
187
+
188
+ class ModelHash < Hash
189
+ def unenquire(class_id)
190
+ @enquired ||= {}
191
+ @enquired[class_id = class_id.to_s] = false
192
+ end
193
+
194
+ def enquired?(class_id)
195
+ @enquired ||= {}
196
+ @enquired[class_id.to_s]
197
+ end
198
+
199
+ def [](class_id)
200
+ enquired?(class_id = class_id.to_s)
201
+ @enquired[class_id] = true
202
+ super(class_id)
203
+ end
204
+ end
205
+ end