ibm_db 3.0.0-x86-mingw32 → 3.0.1-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/OLD/extconf.rb +264 -0
  8. data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
  9. data/ext/extconf.rb +291 -264
  10. data/ext/ibm_db.c +2 -2
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4 -4
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +115 -115
  19. data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
  20. data/test/assets/example.log +1 -0
  21. data/test/assets/flowers.jpg +0 -0
  22. data/test/assets/test.txt +1 -0
  23. data/test/cases/adapter_test.rb +261 -207
  24. data/test/cases/aggregations_test.rb +158 -0
  25. data/test/cases/ar_schema_test.rb +161 -0
  26. data/test/cases/associations/association_scope_test.rb +21 -0
  27. data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
  28. data/test/cases/associations/callbacks_test.rb +192 -0
  29. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
  30. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
  31. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  32. data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
  33. data/test/cases/associations/eager_singularization_test.rb +148 -0
  34. data/test/cases/associations/eager_test.rb +1411 -0
  35. data/test/cases/associations/extension_test.rb +82 -0
  36. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
  37. data/test/cases/associations/has_many_associations_test.rb +2162 -0
  38. data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
  39. data/test/cases/associations/has_one_associations_test.rb +610 -0
  40. data/test/cases/associations/has_one_through_associations_test.rb +380 -0
  41. data/test/cases/associations/inner_join_association_test.rb +139 -0
  42. data/test/cases/associations/inverse_associations_test.rb +693 -0
  43. data/test/cases/associations/join_model_test.rb +754 -743
  44. data/test/cases/associations/nested_through_associations_test.rb +579 -0
  45. data/test/cases/associations/required_test.rb +82 -0
  46. data/test/cases/associations_test.rb +380 -0
  47. data/test/cases/attribute_decorators_test.rb +125 -0
  48. data/test/cases/attribute_methods/read_test.rb +60 -0
  49. data/test/cases/attribute_methods/serialization_test.rb +29 -0
  50. data/test/cases/attribute_methods_test.rb +952 -822
  51. data/test/cases/attribute_set_test.rb +200 -0
  52. data/test/cases/attribute_test.rb +180 -0
  53. data/test/cases/attributes_test.rb +136 -0
  54. data/test/cases/autosave_association_test.rb +1595 -0
  55. data/test/cases/base_test.rb +1638 -2133
  56. data/test/cases/batches_test.rb +212 -0
  57. data/test/cases/binary_test.rb +52 -0
  58. data/test/cases/bind_parameter_test.rb +100 -0
  59. data/test/cases/calculations_test.rb +646 -482
  60. data/test/cases/callbacks_test.rb +543 -0
  61. data/test/cases/clone_test.rb +40 -0
  62. data/test/cases/coders/yaml_column_test.rb +63 -0
  63. data/test/cases/column_alias_test.rb +17 -0
  64. data/test/cases/column_definition_test.rb +123 -0
  65. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
  66. data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
  67. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  68. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
  69. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
  70. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  71. data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
  72. data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
  73. data/test/cases/connection_management_test.rb +122 -0
  74. data/test/cases/connection_pool_test.rb +346 -0
  75. data/test/cases/connection_specification/resolver_test.rb +116 -0
  76. data/test/cases/core_test.rb +112 -0
  77. data/test/cases/counter_cache_test.rb +209 -0
  78. data/test/cases/custom_locking_test.rb +17 -0
  79. data/test/cases/database_statements_test.rb +19 -0
  80. data/test/cases/date_time_test.rb +61 -0
  81. data/test/cases/defaults_test.rb +223 -0
  82. data/test/cases/dirty_test.rb +775 -0
  83. data/test/cases/disconnected_test.rb +28 -0
  84. data/test/cases/dup_test.rb +157 -0
  85. data/test/cases/enum_test.rb +290 -0
  86. data/test/cases/explain_subscriber_test.rb +64 -0
  87. data/test/cases/explain_test.rb +76 -0
  88. data/test/cases/finder_respond_to_test.rb +60 -0
  89. data/test/cases/finder_test.rb +1166 -0
  90. data/test/cases/fixture_set/file_test.rb +138 -0
  91. data/test/cases/fixtures_test.rb +897 -0
  92. data/test/cases/forbidden_attributes_protection_test.rb +99 -0
  93. data/test/cases/habtm_destroy_order_test.rb +61 -0
  94. data/test/cases/helper.rb +210 -0
  95. data/test/cases/hot_compatibility_test.rb +54 -0
  96. data/test/cases/i18n_test.rb +45 -0
  97. data/test/cases/inheritance_test.rb +375 -0
  98. data/test/cases/integration_test.rb +139 -0
  99. data/test/cases/invalid_connection_test.rb +22 -0
  100. data/test/cases/invalid_date_test.rb +32 -0
  101. data/test/cases/invertible_migration_test.rb +295 -0
  102. data/test/cases/json_serialization_test.rb +302 -0
  103. data/test/cases/locking_test.rb +477 -0
  104. data/test/cases/log_subscriber_test.rb +136 -0
  105. data/test/cases/migration/change_schema_test - Copy.rb +448 -0
  106. data/test/cases/migration/change_schema_test.rb +472 -0
  107. data/test/cases/migration/change_table_test.rb +224 -0
  108. data/test/cases/migration/column_attributes_test.rb +192 -0
  109. data/test/cases/migration/column_positioning_test.rb +56 -0
  110. data/test/cases/migration/columns_test.rb +304 -0
  111. data/test/cases/migration/command_recorder_test.rb +305 -0
  112. data/test/cases/migration/create_join_table_test.rb +148 -0
  113. data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
  114. data/test/cases/migration/foreign_key_test.rb +360 -0
  115. data/test/cases/migration/helper.rb +39 -0
  116. data/test/cases/migration/index_test.rb +216 -0
  117. data/test/cases/migration/logger_test.rb +36 -0
  118. data/test/cases/migration/pending_migrations_test.rb +53 -0
  119. data/test/cases/migration/references_foreign_key_test.rb +214 -0
  120. data/test/cases/migration/references_index_test.rb +101 -0
  121. data/test/cases/migration/references_statements_test.rb +116 -0
  122. data/test/cases/migration/rename_table_test.rb +93 -0
  123. data/test/cases/migration/table_and_index_test.rb +24 -0
  124. data/test/cases/migration_test.rb +959 -2408
  125. data/test/cases/migrator_test.rb +388 -0
  126. data/test/cases/mixin_test.rb +70 -0
  127. data/test/cases/modules_test.rb +173 -0
  128. data/test/cases/multiparameter_attributes_test.rb +350 -0
  129. data/test/cases/multiple_db_test.rb +115 -0
  130. data/test/cases/nested_attributes_test.rb +1057 -0
  131. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
  132. data/test/cases/persistence_test.rb +909 -642
  133. data/test/cases/pooled_connections_test.rb +81 -0
  134. data/test/cases/primary_keys_test.rb +237 -0
  135. data/test/cases/query_cache_test.rb +326 -257
  136. data/test/cases/quoting_test.rb +156 -0
  137. data/test/cases/readonly_test.rb +118 -0
  138. data/test/cases/reaper_test.rb +85 -0
  139. data/test/cases/reflection_test.rb +454 -0
  140. data/test/cases/relation/delegation_test.rb +68 -0
  141. data/test/cases/relation/merging_test.rb +161 -0
  142. data/test/cases/relation/mutation_test.rb +165 -0
  143. data/test/cases/relation/predicate_builder_test.rb +14 -0
  144. data/test/cases/relation/where_chain_test.rb +181 -0
  145. data/test/cases/relation/where_test.rb +300 -0
  146. data/test/cases/relation/where_test2.rb +36 -0
  147. data/test/cases/relation_test.rb +297 -0
  148. data/test/cases/relations_test.rb +1815 -1182
  149. data/test/cases/reload_models_test.rb +22 -0
  150. data/test/cases/result_test.rb +80 -0
  151. data/test/cases/sanitize_test.rb +83 -0
  152. data/test/cases/schema_dumper_test.rb +463 -256
  153. data/test/cases/scoping/default_scoping_test.rb +454 -0
  154. data/test/cases/scoping/named_scoping_test.rb +524 -0
  155. data/test/cases/scoping/relation_scoping_test.rb +357 -0
  156. data/test/cases/serialization_test.rb +104 -0
  157. data/test/cases/serialized_attribute_test.rb +277 -0
  158. data/test/cases/statement_cache_test.rb +98 -0
  159. data/test/cases/store_test.rb +194 -0
  160. data/test/cases/tasks/database_tasks_test.rb +396 -0
  161. data/test/cases/tasks/mysql_rake_test.rb +311 -0
  162. data/test/cases/tasks/postgresql_rake_test.rb +245 -0
  163. data/test/cases/tasks/sqlite_rake_test.rb +193 -0
  164. data/test/cases/test_case.rb +123 -0
  165. data/test/cases/timestamp_test.rb +468 -0
  166. data/test/cases/transaction_callbacks_test.rb +452 -300
  167. data/test/cases/transaction_isolation_test.rb +106 -0
  168. data/test/cases/transactions_test.rb +817 -0
  169. data/test/cases/type/decimal_test.rb +51 -0
  170. data/test/cases/type/integer_test.rb +121 -0
  171. data/test/cases/type/string_test.rb +36 -0
  172. data/test/cases/type/type_map_test.rb +177 -0
  173. data/test/cases/type/unsigned_integer_test.rb +18 -0
  174. data/test/cases/types_test.rb +141 -0
  175. data/test/cases/unconnected_test.rb +33 -0
  176. data/test/cases/validations/association_validation_test.rb +86 -0
  177. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
  178. data/test/cases/validations/i18n_validation_test.rb +90 -0
  179. data/test/cases/validations/length_validation_test.rb +47 -0
  180. data/test/cases/validations/presence_validation_test.rb +68 -0
  181. data/test/cases/validations/uniqueness_validation_test.rb +434 -299
  182. data/test/cases/validations_repair_helper.rb +23 -0
  183. data/test/cases/validations_test.rb +165 -0
  184. data/test/cases/view_test.rb +113 -0
  185. data/test/cases/xml_serialization_test.rb +457 -408
  186. data/test/cases/yaml_serialization_test.rb +86 -0
  187. data/test/config.rb +5 -0
  188. data/test/config.yml +154 -154
  189. data/test/connections/native_ibm_db/connection.rb +43 -43
  190. data/test/fixtures/accounts.yml +29 -0
  191. data/test/fixtures/admin/accounts.yml +2 -0
  192. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  193. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  194. data/test/fixtures/admin/users.yml +10 -0
  195. data/test/fixtures/all/admin +1 -0
  196. data/test/fixtures/all/developers.yml +0 -0
  197. data/test/fixtures/all/people.yml +0 -0
  198. data/test/fixtures/all/tasks.yml +0 -0
  199. data/test/fixtures/author_addresses.yml +18 -0
  200. data/test/fixtures/author_favorites.yml +4 -0
  201. data/test/fixtures/authors.yml +23 -0
  202. data/test/fixtures/binaries.yml +133 -0
  203. data/test/fixtures/books.yml +11 -0
  204. data/test/fixtures/bulbs.yml +5 -0
  205. data/test/fixtures/cars.yml +9 -0
  206. data/test/fixtures/categories.yml +19 -0
  207. data/test/fixtures/categories/special_categories.yml +9 -0
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  209. data/test/fixtures/categories_ordered.yml +7 -0
  210. data/test/fixtures/categories_posts.yml +31 -0
  211. data/test/fixtures/categorizations.yml +23 -0
  212. data/test/fixtures/clubs.yml +8 -0
  213. data/test/fixtures/collections.yml +3 -0
  214. data/test/fixtures/colleges.yml +3 -0
  215. data/test/fixtures/comments.yml +65 -0
  216. data/test/fixtures/companies.yml +67 -0
  217. data/test/fixtures/computers.yml +10 -0
  218. data/test/fixtures/courses.yml +8 -0
  219. data/test/fixtures/customers.yml +26 -0
  220. data/test/fixtures/dashboards.yml +6 -0
  221. data/test/fixtures/developers.yml +22 -0
  222. data/test/fixtures/developers_projects.yml +17 -0
  223. data/test/fixtures/dog_lovers.yml +7 -0
  224. data/test/fixtures/dogs.yml +4 -0
  225. data/test/fixtures/doubloons.yml +3 -0
  226. data/test/fixtures/edges.yml +5 -0
  227. data/test/fixtures/entrants.yml +14 -0
  228. data/test/fixtures/essays.yml +6 -0
  229. data/test/fixtures/faces.yml +11 -0
  230. data/test/fixtures/fk_test_has_fk.yml +3 -0
  231. data/test/fixtures/fk_test_has_pk.yml +2 -0
  232. data/test/fixtures/friendships.yml +4 -0
  233. data/test/fixtures/funny_jokes.yml +10 -0
  234. data/test/fixtures/interests.yml +33 -0
  235. data/test/fixtures/items.yml +3 -0
  236. data/test/fixtures/jobs.yml +7 -0
  237. data/test/fixtures/legacy_things.yml +3 -0
  238. data/test/fixtures/mateys.yml +4 -0
  239. data/test/fixtures/member_details.yml +8 -0
  240. data/test/fixtures/member_types.yml +6 -0
  241. data/test/fixtures/members.yml +11 -0
  242. data/test/fixtures/memberships.yml +34 -0
  243. data/test/fixtures/men.yml +5 -0
  244. data/test/fixtures/minimalistics.yml +2 -0
  245. data/test/fixtures/minivans.yml +5 -0
  246. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  247. data/test/fixtures/mixins.yml +29 -0
  248. data/test/fixtures/movies.yml +7 -0
  249. data/test/fixtures/naked/csv/accounts.csv +1 -0
  250. data/test/fixtures/naked/yml/accounts.yml +1 -0
  251. data/test/fixtures/naked/yml/companies.yml +1 -0
  252. data/test/fixtures/naked/yml/courses.yml +1 -0
  253. data/test/fixtures/organizations.yml +5 -0
  254. data/test/fixtures/other_topics.yml +42 -0
  255. data/test/fixtures/owners.yml +9 -0
  256. data/test/fixtures/parrots.yml +27 -0
  257. data/test/fixtures/parrots_pirates.yml +7 -0
  258. data/test/fixtures/people.yml +24 -0
  259. data/test/fixtures/peoples_treasures.yml +3 -0
  260. data/test/fixtures/pets.yml +19 -0
  261. data/test/fixtures/pirates.yml +12 -0
  262. data/test/fixtures/posts.yml +80 -0
  263. data/test/fixtures/price_estimates.yml +7 -0
  264. data/test/fixtures/products.yml +4 -0
  265. data/test/fixtures/projects.yml +7 -0
  266. data/test/fixtures/randomly_named_a9.yml +7 -0
  267. data/test/fixtures/ratings.yml +14 -0
  268. data/test/fixtures/readers.yml +11 -0
  269. data/test/fixtures/references.yml +17 -0
  270. data/test/fixtures/reserved_words/distinct.yml +5 -0
  271. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  272. data/test/fixtures/reserved_words/group.yml +14 -0
  273. data/test/fixtures/reserved_words/select.yml +8 -0
  274. data/test/fixtures/reserved_words/values.yml +7 -0
  275. data/test/fixtures/ships.yml +6 -0
  276. data/test/fixtures/speedometers.yml +8 -0
  277. data/test/fixtures/sponsors.yml +12 -0
  278. data/test/fixtures/string_key_objects.yml +7 -0
  279. data/test/fixtures/subscribers.yml +11 -0
  280. data/test/fixtures/subscriptions.yml +12 -0
  281. data/test/fixtures/taggings.yml +78 -0
  282. data/test/fixtures/tags.yml +11 -0
  283. data/test/fixtures/tasks.yml +7 -0
  284. data/test/fixtures/teapots.yml +3 -0
  285. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  286. data/test/fixtures/to_be_linked/users.yml +10 -0
  287. data/test/fixtures/topics.yml +49 -0
  288. data/test/fixtures/toys.yml +14 -0
  289. data/test/fixtures/traffic_lights.yml +10 -0
  290. data/test/fixtures/treasures.yml +10 -0
  291. data/test/fixtures/uuid_children.yml +3 -0
  292. data/test/fixtures/uuid_parents.yml +2 -0
  293. data/test/fixtures/variants.yml +4 -0
  294. data/test/fixtures/vegetables.yml +20 -0
  295. data/test/fixtures/vertices.yml +4 -0
  296. data/test/fixtures/warehouse_things.yml +3 -0
  297. data/test/fixtures/zines.yml +5 -0
  298. data/test/ibm_db_test.rb +24 -24
  299. data/test/migrations/10_urban/9_add_expressions.rb +11 -0
  300. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  301. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
  302. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  303. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  304. data/test/migrations/missing/3_we_need_reminders.rb +12 -0
  305. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  306. data/test/migrations/rename/1_we_need_things.rb +11 -0
  307. data/test/migrations/rename/2_rename_things.rb +9 -0
  308. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
  309. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
  310. data/test/migrations/to_copy2/1_create_articles.rb +7 -0
  311. data/test/migrations/to_copy2/2_create_comments.rb +7 -0
  312. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
  313. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
  314. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
  315. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
  316. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
  317. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
  318. data/test/migrations/valid/2_we_need_reminders.rb +12 -0
  319. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  320. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
  321. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
  322. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
  323. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
  324. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
  325. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
  326. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
  327. data/test/models/admin.rb +5 -0
  328. data/test/models/admin/account.rb +3 -0
  329. data/test/models/admin/randomly_named_c1.rb +3 -0
  330. data/test/models/admin/user.rb +40 -0
  331. data/test/models/aircraft.rb +4 -0
  332. data/test/models/arunit2_model.rb +3 -0
  333. data/test/models/author.rb +212 -0
  334. data/test/models/auto_id.rb +4 -0
  335. data/test/models/autoloadable/extra_firm.rb +2 -0
  336. data/test/models/binary.rb +2 -0
  337. data/test/models/bird.rb +12 -0
  338. data/test/models/book.rb +18 -0
  339. data/test/models/boolean.rb +2 -0
  340. data/test/models/bulb.rb +51 -0
  341. data/test/models/cake_designer.rb +3 -0
  342. data/test/models/car.rb +26 -0
  343. data/test/models/carrier.rb +2 -0
  344. data/test/models/categorization.rb +19 -0
  345. data/test/models/category.rb +35 -0
  346. data/test/models/chef.rb +3 -0
  347. data/test/models/citation.rb +3 -0
  348. data/test/models/club.rb +23 -0
  349. data/test/models/college.rb +10 -0
  350. data/test/models/column.rb +3 -0
  351. data/test/models/column_name.rb +3 -0
  352. data/test/models/comment.rb +64 -0
  353. data/test/models/company.rb +225 -0
  354. data/test/models/company_in_module.rb +98 -0
  355. data/test/models/computer.rb +3 -0
  356. data/test/models/contact.rb +41 -0
  357. data/test/models/contract.rb +20 -0
  358. data/test/models/country.rb +7 -0
  359. data/test/models/course.rb +6 -0
  360. data/test/models/customer.rb +77 -0
  361. data/test/models/customer_carrier.rb +14 -0
  362. data/test/models/dashboard.rb +3 -0
  363. data/test/models/default.rb +2 -0
  364. data/test/models/department.rb +4 -0
  365. data/test/models/developer.rb +252 -0
  366. data/test/models/dog.rb +5 -0
  367. data/test/models/dog_lover.rb +5 -0
  368. data/test/models/doubloon.rb +12 -0
  369. data/test/models/drink_designer.rb +3 -0
  370. data/test/models/edge.rb +5 -0
  371. data/test/models/electron.rb +5 -0
  372. data/test/models/engine.rb +4 -0
  373. data/test/models/entrant.rb +3 -0
  374. data/test/models/essay.rb +5 -0
  375. data/test/models/event.rb +3 -0
  376. data/test/models/eye.rb +37 -0
  377. data/test/models/face.rb +9 -0
  378. data/test/models/friendship.rb +6 -0
  379. data/test/models/guid.rb +2 -0
  380. data/test/models/hotel.rb +6 -0
  381. data/test/models/image.rb +3 -0
  382. data/test/models/interest.rb +5 -0
  383. data/test/models/invoice.rb +4 -0
  384. data/test/models/item.rb +7 -0
  385. data/test/models/job.rb +7 -0
  386. data/test/models/joke.rb +7 -0
  387. data/test/models/keyboard.rb +3 -0
  388. data/test/models/legacy_thing.rb +3 -0
  389. data/test/models/lesson.rb +11 -0
  390. data/test/models/line_item.rb +3 -0
  391. data/test/models/liquid.rb +4 -0
  392. data/test/models/man.rb +11 -0
  393. data/test/models/matey.rb +4 -0
  394. data/test/models/member.rb +41 -0
  395. data/test/models/member_detail.rb +7 -0
  396. data/test/models/member_type.rb +3 -0
  397. data/test/models/membership.rb +35 -0
  398. data/test/models/minimalistic.rb +2 -0
  399. data/test/models/minivan.rb +9 -0
  400. data/test/models/mixed_case_monkey.rb +3 -0
  401. data/test/models/molecule.rb +6 -0
  402. data/test/models/movie.rb +5 -0
  403. data/test/models/order.rb +4 -0
  404. data/test/models/organization.rb +14 -0
  405. data/test/models/owner.rb +34 -0
  406. data/test/models/parrot.rb +29 -0
  407. data/test/models/person.rb +143 -0
  408. data/test/models/personal_legacy_thing.rb +4 -0
  409. data/test/models/pet.rb +15 -0
  410. data/test/models/pirate.rb +92 -0
  411. data/test/models/possession.rb +3 -0
  412. data/test/models/post.rb +264 -0
  413. data/test/models/price_estimate.rb +4 -0
  414. data/test/models/professor.rb +5 -0
  415. data/test/models/project.rb +29 -0
  416. data/test/models/publisher.rb +2 -0
  417. data/test/models/publisher/article.rb +4 -0
  418. data/test/models/publisher/magazine.rb +3 -0
  419. data/test/models/randomly_named_c1.rb +3 -0
  420. data/test/models/rating.rb +4 -0
  421. data/test/models/reader.rb +23 -0
  422. data/test/models/record.rb +2 -0
  423. data/test/models/reference.rb +22 -0
  424. data/test/models/reply.rb +61 -0
  425. data/test/models/ship.rb +33 -0
  426. data/test/models/ship_part.rb +8 -0
  427. data/test/models/shop.rb +17 -0
  428. data/test/models/shop_account.rb +6 -0
  429. data/test/models/speedometer.rb +6 -0
  430. data/test/models/sponsor.rb +7 -0
  431. data/test/models/string_key_object.rb +3 -0
  432. data/test/models/student.rb +4 -0
  433. data/test/models/subject.rb +16 -0
  434. data/test/models/subscriber.rb +8 -0
  435. data/test/models/subscription.rb +4 -0
  436. data/test/models/tag.rb +7 -0
  437. data/test/models/tagging.rb +13 -0
  438. data/test/models/task.rb +5 -0
  439. data/test/models/topic.rb +124 -0
  440. data/test/models/toy.rb +6 -0
  441. data/test/models/traffic_light.rb +4 -0
  442. data/test/models/treasure.rb +14 -0
  443. data/test/models/treaty.rb +7 -0
  444. data/test/models/tyre.rb +11 -0
  445. data/test/models/uuid_child.rb +3 -0
  446. data/test/models/uuid_parent.rb +3 -0
  447. data/test/models/vegetables.rb +24 -0
  448. data/test/models/vehicle.rb +7 -0
  449. data/test/models/vertex.rb +9 -0
  450. data/test/models/warehouse_thing.rb +5 -5
  451. data/test/models/wheel.rb +3 -0
  452. data/test/models/without_table.rb +3 -0
  453. data/test/models/zine.rb +3 -0
  454. data/test/schema/mysql2_specific_schema.rb +58 -0
  455. data/test/schema/mysql_specific_schema.rb +70 -0
  456. data/test/schema/oracle_specific_schema.rb +43 -0
  457. data/test/schema/postgresql_specific_schema.rb +202 -0
  458. data/test/schema/schema.rb +938 -751
  459. data/test/schema/sqlite_specific_schema.rb +22 -0
  460. data/test/support/config.rb +43 -0
  461. data/test/support/connection.rb +22 -0
  462. data/test/support/connection_helper.rb +14 -0
  463. data/test/support/ddl_helper.rb +8 -0
  464. data/test/support/schema_dumping_helper.rb +20 -0
  465. metadata +444 -18
@@ -0,0 +1,4 @@
1
+ class AutoId < ActiveRecord::Base
2
+ self.table_name = "auto_id_tests"
3
+ self.primary_key = "auto_id"
4
+ end
@@ -0,0 +1,2 @@
1
+ class ExtraFirm < Company
2
+ end
@@ -0,0 +1,2 @@
1
+ class Binary < ActiveRecord::Base
2
+ end
@@ -0,0 +1,12 @@
1
+ class Bird < ActiveRecord::Base
2
+ belongs_to :pirate
3
+ validates_presence_of :name
4
+
5
+ accepts_nested_attributes_for :pirate
6
+
7
+ attr_accessor :cancel_save_from_callback
8
+ before_save :cancel_save_callback_method, :if => :cancel_save_from_callback
9
+ def cancel_save_callback_method
10
+ false
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ class Book < ActiveRecord::Base
2
+ has_many :authors
3
+
4
+ has_many :citations, :foreign_key => 'book1_id'
5
+ has_many :references, -> { distinct }, through: :citations, source: :reference_of
6
+
7
+ has_many :subscriptions
8
+ has_many :subscribers, through: :subscriptions
9
+
10
+ enum status: [:proposed, :written, :published]
11
+ enum read_status: {unread: 0, reading: 2, read: 3}
12
+ enum nullable_status: [:single, :married]
13
+
14
+ def published!
15
+ super
16
+ "do publish work..."
17
+ end
18
+ end
@@ -0,0 +1,2 @@
1
+ class Boolean < ActiveRecord::Base
2
+ end
@@ -0,0 +1,51 @@
1
+ class Bulb < ActiveRecord::Base
2
+ default_scope { where(:name => 'defaulty') }
3
+ belongs_to :car, :touch => true
4
+
5
+ attr_reader :scope_after_initialize, :attributes_after_initialize
6
+
7
+ after_initialize :record_scope_after_initialize
8
+ def record_scope_after_initialize
9
+ @scope_after_initialize = self.class.all
10
+ end
11
+
12
+ after_initialize :record_attributes_after_initialize
13
+ def record_attributes_after_initialize
14
+ @attributes_after_initialize = attributes.dup
15
+ end
16
+
17
+ def color=(color)
18
+ self[:color] = color.upcase + "!"
19
+ end
20
+
21
+ def self.new(attributes = {}, &block)
22
+ bulb_type = (attributes || {}).delete(:bulb_type)
23
+
24
+ if bulb_type.present?
25
+ bulb_class = "#{bulb_type.to_s.camelize}Bulb".constantize
26
+ bulb_class.new(attributes, &block)
27
+ else
28
+ super
29
+ end
30
+ end
31
+ end
32
+
33
+ class CustomBulb < Bulb
34
+ after_initialize :set_awesomeness
35
+
36
+ def set_awesomeness
37
+ self.frickinawesome = true if name == 'Dude'
38
+ end
39
+ end
40
+
41
+ class FunkyBulb < Bulb
42
+ before_destroy do
43
+ raise "before_destroy was called"
44
+ end
45
+ end
46
+
47
+ class FailedBulb < Bulb
48
+ before_destroy do
49
+ false
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ class CakeDesigner < ActiveRecord::Base
2
+ has_one :chef, as: :employable
3
+ end
@@ -0,0 +1,26 @@
1
+ class Car < ActiveRecord::Base
2
+ has_many :bulbs
3
+ has_many :all_bulbs, -> { unscope where: :name }, class_name: "Bulb"
4
+ has_many :funky_bulbs, class_name: 'FunkyBulb', dependent: :destroy
5
+ has_many :failed_bulbs, class_name: 'FailedBulb', dependent: :destroy
6
+ has_many :foo_bulbs, -> { where(:name => 'foo') }, :class_name => "Bulb"
7
+
8
+ has_one :bulb
9
+
10
+ has_many :tyres
11
+ has_many :engines, :dependent => :destroy, inverse_of: :my_car
12
+ has_many :wheels, :as => :wheelable, :dependent => :destroy
13
+
14
+ scope :incl_tyres, -> { includes(:tyres) }
15
+ scope :incl_engines, -> { includes(:engines) }
16
+
17
+ scope :order_using_new_style, -> { order('name asc') }
18
+ end
19
+
20
+ class CoolCar < Car
21
+ default_scope { order('name desc') }
22
+ end
23
+
24
+ class FastCar < Car
25
+ default_scope { order('name desc') }
26
+ end
@@ -0,0 +1,2 @@
1
+ class Carrier < ActiveRecord::Base
2
+ end
@@ -0,0 +1,19 @@
1
+ class Categorization < ActiveRecord::Base
2
+ belongs_to :post
3
+ belongs_to :category, counter_cache: true
4
+ belongs_to :named_category, :class_name => 'Category', :foreign_key => :named_category_name, :primary_key => :name
5
+ belongs_to :author
6
+
7
+ has_many :post_taggings, :through => :author, :source => :taggings
8
+
9
+ belongs_to :author_using_custom_pk, :class_name => 'Author', :foreign_key => :author_id, :primary_key => :author_address_extra_id
10
+ has_many :authors_using_custom_pk, :class_name => 'Author', :foreign_key => :id, :primary_key => :category_id
11
+ end
12
+
13
+ class SpecialCategorization < ActiveRecord::Base
14
+ self.table_name = 'categorizations'
15
+ default_scope { where(:special => true) }
16
+
17
+ belongs_to :author
18
+ belongs_to :category
19
+ end
@@ -0,0 +1,35 @@
1
+ class Category < ActiveRecord::Base
2
+ has_and_belongs_to_many :posts
3
+ has_and_belongs_to_many :special_posts, :class_name => "Post"
4
+ has_and_belongs_to_many :other_posts, :class_name => "Post"
5
+ has_and_belongs_to_many :posts_with_authors_sorted_by_author_id, -> { includes(:authors).order("authors.id") }, :class_name => "Post"
6
+
7
+ has_and_belongs_to_many :select_testing_posts,
8
+ -> { select 'posts.*, 1 as correctness_marker' },
9
+ :class_name => 'Post',
10
+ :foreign_key => 'category_id',
11
+ :association_foreign_key => 'post_id'
12
+
13
+ has_and_belongs_to_many :post_with_conditions,
14
+ -> { where :title => 'Yet Another Testing Title' },
15
+ :class_name => 'Post'
16
+
17
+ has_and_belongs_to_many :popular_grouped_posts, -> { group("posts.type").having("sum(comments.post_id) > 2").includes(:comments) }, :class_name => "Post"
18
+ has_and_belongs_to_many :posts_grouped_by_title, -> { group("title").select("title") }, :class_name => "Post"
19
+
20
+ def self.what_are_you
21
+ 'a category...'
22
+ end
23
+
24
+ has_many :categorizations
25
+ has_many :special_categorizations
26
+ has_many :post_comments, :through => :posts, :source => :comments
27
+
28
+ has_many :authors, :through => :categorizations
29
+ has_many :authors_with_select, -> { select 'authors.*, categorizations.post_id' }, :through => :categorizations, :source => :author
30
+
31
+ scope :general, -> { where(:name => 'General') }
32
+ end
33
+
34
+ class SpecialCategory < Category
35
+ end
@@ -0,0 +1,3 @@
1
+ class Chef < ActiveRecord::Base
2
+ belongs_to :employable, polymorphic: true
3
+ end
@@ -0,0 +1,3 @@
1
+ class Citation < ActiveRecord::Base
2
+ belongs_to :reference_of, :class_name => "Book", :foreign_key => :book2_id
3
+ end
@@ -0,0 +1,23 @@
1
+ class Club < ActiveRecord::Base
2
+ has_one :membership
3
+ has_many :memberships, :inverse_of => false
4
+ has_many :members, :through => :memberships
5
+ has_one :sponsor
6
+ has_one :sponsored_member, :through => :sponsor, :source => :sponsorable, :source_type => "Member"
7
+ belongs_to :category
8
+
9
+ has_many :favourites, -> { where(memberships: { favourite: true }) }, through: :memberships, source: :member
10
+
11
+ private
12
+
13
+ def private_method
14
+ "I'm sorry sir, this is a *private* club, not a *pirate* club"
15
+ end
16
+ end
17
+
18
+ class SuperClub < ActiveRecord::Base
19
+ self.table_name = "clubs"
20
+
21
+ has_many :memberships, class_name: 'SuperMembership', foreign_key: 'club_id'
22
+ has_many :members, through: :memberships
23
+ end
@@ -0,0 +1,10 @@
1
+ require_dependency 'models/arunit2_model'
2
+ require 'active_support/core_ext/object/with_options'
3
+
4
+ class College < ARUnit2Model
5
+ has_many :courses
6
+
7
+ with_options dependent: :destroy do |assoc|
8
+ assoc.has_many :students, -> { where(active: true) }
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ class Column < ActiveRecord::Base
2
+ belongs_to :record
3
+ end
@@ -0,0 +1,3 @@
1
+ class ColumnName < ActiveRecord::Base
2
+ self.table_name = "colnametests"
3
+ end
@@ -0,0 +1,64 @@
1
+ class Comment < ActiveRecord::Base
2
+ scope :limit_by, lambda {|l| limit(l) }
3
+ scope :containing_the_letter_e, -> { where("comments.body LIKE '%e%'") }
4
+ scope :not_again, -> { where("comments.body NOT LIKE '%again%'") }
5
+ scope :for_first_post, -> { where(:post_id => 1) }
6
+ scope :for_first_author, -> { joins(:post).where("posts.author_id" => 1) }
7
+ scope :created, -> { all }
8
+
9
+ belongs_to :post, :counter_cache => true
10
+ belongs_to :author, polymorphic: true
11
+ belongs_to :resource, polymorphic: true
12
+ belongs_to :developer
13
+
14
+ has_many :ratings
15
+
16
+ belongs_to :first_post, :foreign_key => :post_id
17
+
18
+ has_many :children, :class_name => 'Comment', :foreign_key => :parent_id
19
+ belongs_to :parent, :class_name => 'Comment', :counter_cache => :children_count
20
+
21
+ def self.what_are_you
22
+ 'a comment...'
23
+ end
24
+
25
+ def self.search_by_type(q)
26
+ where("#{QUOTED_TYPE} = ?", q)
27
+ end
28
+
29
+ def self.all_as_method
30
+ all
31
+ end
32
+ scope :all_as_scope, -> { all }
33
+
34
+ def to_s
35
+ body
36
+ end
37
+ end
38
+
39
+ class SpecialComment < Comment
40
+ end
41
+
42
+ class SubSpecialComment < SpecialComment
43
+ end
44
+
45
+ class VerySpecialComment < Comment
46
+ end
47
+
48
+ class CommentThatAutomaticallyAltersPostBody < Comment
49
+ belongs_to :post, class_name: "PostThatLoadsCommentsInAnAfterSaveHook", foreign_key: :post_id
50
+
51
+ after_save do |comment|
52
+ comment.post.update_attributes(body: "Automatically altered")
53
+ end
54
+ end
55
+
56
+ class CommentWithDefaultScopeReferencesAssociation < Comment
57
+ default_scope ->{ includes(:developer).order('developers.name').references(:developer) }
58
+ belongs_to :developer
59
+ end
60
+
61
+ class CommentWithConflictingDefaultScope < Comment
62
+ default_scope ->{ where(author_id: 42) }
63
+ belongs_to :post_with_conflicting_default_scope, foreign_key: :post_id
64
+ end
@@ -0,0 +1,225 @@
1
+ class AbstractCompany < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
4
+
5
+ class Company < AbstractCompany
6
+ self.sequence_name = :companies_nonstd_seq
7
+
8
+ validates_presence_of :name
9
+
10
+ has_one :dummy_account, :foreign_key => "firm_id", :class_name => "Account"
11
+ has_many :contracts
12
+ has_many :developers, :through => :contracts
13
+ has_many :accounts
14
+
15
+ scope :of_first_firm, lambda {
16
+ joins(:account => :firm).
17
+ where('firms.id' => 1)
18
+ }
19
+
20
+ def arbitrary_method
21
+ "I am Jack's profound disappointment"
22
+ end
23
+
24
+ private
25
+
26
+ def private_method
27
+ "I am Jack's innermost fears and aspirations"
28
+ end
29
+ end
30
+
31
+ module Namespaced
32
+ class Company < ::Company
33
+ end
34
+
35
+ class Firm < ::Company
36
+ has_many :clients, :class_name => 'Namespaced::Client'
37
+ end
38
+
39
+ class Client < ::Company
40
+ end
41
+ end
42
+
43
+ class Firm < Company
44
+ to_param :name
45
+
46
+ has_many :clients, -> { order "id" }, :dependent => :destroy, :before_remove => :log_before_remove, :after_remove => :log_after_remove
47
+ has_many :unsorted_clients, :class_name => "Client"
48
+ has_many :unsorted_clients_with_symbol, :class_name => :Client
49
+ has_many :clients_sorted_desc, -> { order "id DESC" }, :class_name => "Client"
50
+ has_many :clients_of_firm, -> { order "id" }, :foreign_key => "client_of", :class_name => "Client", :inverse_of => :firm
51
+ has_many :clients_ordered_by_name, -> { order "name" }, :class_name => "Client"
52
+ has_many :unvalidated_clients_of_firm, :foreign_key => "client_of", :class_name => "Client", :validate => false
53
+ has_many :dependent_clients_of_firm, -> { order "id" }, :foreign_key => "client_of", :class_name => "Client", :dependent => :destroy
54
+ has_many :exclusively_dependent_clients_of_firm, -> { order "id" }, :foreign_key => "client_of", :class_name => "Client", :dependent => :delete_all
55
+ has_many :limited_clients, -> { limit 1 }, :class_name => "Client"
56
+ has_many :clients_with_interpolated_conditions, ->(firm) { where "rating > #{firm.rating}" }, :class_name => "Client"
57
+ has_many :clients_like_ms, -> { where("name = 'Microsoft'").order("id") }, :class_name => "Client"
58
+ has_many :clients_like_ms_with_hash_conditions, -> { where(:name => 'Microsoft').order("id") }, :class_name => "Client"
59
+ has_many :plain_clients, :class_name => 'Client'
60
+ has_many :clients_using_primary_key, :class_name => 'Client',
61
+ :primary_key => 'name', :foreign_key => 'firm_name'
62
+ has_many :clients_using_primary_key_with_delete_all, :class_name => 'Client',
63
+ :primary_key => 'name', :foreign_key => 'firm_name', :dependent => :delete_all
64
+ has_many :clients_grouped_by_firm_id, -> { group("firm_id").select("firm_id") }, :class_name => "Client"
65
+ has_many :clients_grouped_by_name, -> { group("name").select("name") }, :class_name => "Client"
66
+
67
+ has_one :account, :foreign_key => "firm_id", :dependent => :destroy, :validate => true
68
+ has_one :unvalidated_account, :foreign_key => "firm_id", :class_name => 'Account', :validate => false
69
+ has_one :account_with_select, -> { select("id, firm_id") }, :foreign_key => "firm_id", :class_name=>'Account'
70
+ has_one :readonly_account, -> { readonly }, :foreign_key => "firm_id", :class_name => "Account"
71
+ # added order by id as in fixtures there are two accounts for Rails Core
72
+ # Oracle tests were failing because of that as the second fixture was selected
73
+ has_one :account_using_primary_key, -> { order('id') }, :primary_key => "firm_id", :class_name => "Account"
74
+ has_one :account_using_foreign_and_primary_keys, :foreign_key => "firm_name", :primary_key => "name", :class_name => "Account"
75
+ has_one :account_with_inexistent_foreign_key, class_name: 'Account', foreign_key: "inexistent"
76
+ has_one :deletable_account, :foreign_key => "firm_id", :class_name => "Account", :dependent => :delete
77
+
78
+ has_one :account_limit_500_with_hash_conditions, -> { where :credit_limit => 500 }, :foreign_key => "firm_id", :class_name => "Account"
79
+
80
+ has_one :unautosaved_account, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false
81
+ has_many :accounts
82
+ has_many :unautosaved_accounts, :foreign_key => "firm_id", :class_name => 'Account', :autosave => false
83
+
84
+ has_many :association_with_references, -> { references(:foo) }, :class_name => 'Client'
85
+
86
+ def log
87
+ @log ||= []
88
+ end
89
+
90
+ private
91
+ def log_before_remove(record)
92
+ log << "before_remove#{record.id}"
93
+ end
94
+
95
+ def log_after_remove(record)
96
+ log << "after_remove#{record.id}"
97
+ end
98
+ end
99
+
100
+ class DependentFirm < Company
101
+ has_one :account, :foreign_key => "firm_id", :dependent => :nullify
102
+ has_many :companies, :foreign_key => 'client_of', :dependent => :nullify
103
+ has_one :company, :foreign_key => 'client_of', :dependent => :nullify
104
+ end
105
+
106
+ class RestrictedWithExceptionFirm < Company
107
+ has_one :account, -> { order("id") }, :foreign_key => "firm_id", :dependent => :restrict_with_exception
108
+ has_many :companies, -> { order("id") }, :foreign_key => 'client_of', :dependent => :restrict_with_exception
109
+ end
110
+
111
+ class RestrictedWithErrorFirm < Company
112
+ has_one :account, -> { order("id") }, :foreign_key => "firm_id", :dependent => :restrict_with_error
113
+ has_many :companies, -> { order("id") }, :foreign_key => 'client_of', :dependent => :restrict_with_error
114
+ end
115
+
116
+ class Client < Company
117
+ belongs_to :firm, :foreign_key => "client_of"
118
+ belongs_to :firm_with_basic_id, :class_name => "Firm", :foreign_key => "firm_id"
119
+ belongs_to :firm_with_select, -> { select("id") }, :class_name => "Firm", :foreign_key => "firm_id"
120
+ belongs_to :firm_with_other_name, :class_name => "Firm", :foreign_key => "client_of"
121
+ belongs_to :firm_with_condition, -> { where "1 = ?", 1 }, :class_name => "Firm", :foreign_key => "client_of"
122
+ belongs_to :firm_with_primary_key, :class_name => "Firm", :primary_key => "name", :foreign_key => "firm_name"
123
+ belongs_to :firm_with_primary_key_symbols, :class_name => "Firm", :primary_key => :name, :foreign_key => :firm_name
124
+ belongs_to :readonly_firm, -> { readonly }, :class_name => "Firm", :foreign_key => "firm_id"
125
+ belongs_to :bob_firm, -> { where :name => "Bob" }, :class_name => "Firm", :foreign_key => "client_of"
126
+ has_many :accounts, :through => :firm, :source => :accounts
127
+ belongs_to :account
128
+
129
+ validate do
130
+ firm
131
+ end
132
+
133
+ class RaisedOnSave < RuntimeError; end
134
+ attr_accessor :raise_on_save
135
+ before_save do
136
+ raise RaisedOnSave if raise_on_save
137
+ end
138
+
139
+ class RaisedOnDestroy < RuntimeError; end
140
+ attr_accessor :raise_on_destroy
141
+ before_destroy do
142
+ raise RaisedOnDestroy if raise_on_destroy
143
+ end
144
+
145
+ # Record destruction so we can test whether firm.clients.clear has
146
+ # is calling client.destroy, deleting from the database, or setting
147
+ # foreign keys to NULL.
148
+ def self.destroyed_client_ids
149
+ @destroyed_client_ids ||= Hash.new { |h,k| h[k] = [] }
150
+ end
151
+
152
+ before_destroy do |client|
153
+ if client.firm
154
+ Client.destroyed_client_ids[client.firm.id] << client.id
155
+ end
156
+ true
157
+ end
158
+
159
+ before_destroy :overwrite_to_raise
160
+
161
+ # Used to test that read and question methods are not generated for these attributes
162
+ def rating?
163
+ query_attribute :rating
164
+ end
165
+
166
+ def overwrite_to_raise
167
+ end
168
+
169
+ class << self
170
+ private
171
+
172
+ def private_method
173
+ "darkness"
174
+ end
175
+ end
176
+ end
177
+
178
+ class ExclusivelyDependentFirm < Company
179
+ has_one :account, :foreign_key => "firm_id", :dependent => :delete
180
+ has_many :dependent_sanitized_conditional_clients_of_firm, -> { order("id").where("name = 'BigShot Inc.'") }, :foreign_key => "client_of", :class_name => "Client", :dependent => :delete_all
181
+ has_many :dependent_conditional_clients_of_firm, -> { order("id").where("name = ?", 'BigShot Inc.') }, :foreign_key => "client_of", :class_name => "Client", :dependent => :delete_all
182
+ end
183
+
184
+ class SpecialClient < Client
185
+ end
186
+
187
+ class VerySpecialClient < SpecialClient
188
+ end
189
+
190
+ class Account < ActiveRecord::Base
191
+ belongs_to :firm, :class_name => 'Company'
192
+ belongs_to :unautosaved_firm, :foreign_key => "firm_id", :class_name => "Firm", :autosave => false
193
+
194
+ alias_attribute :available_credit, :credit_limit
195
+
196
+ def self.destroyed_account_ids
197
+ @destroyed_account_ids ||= Hash.new { |h,k| h[k] = [] }
198
+ end
199
+
200
+ # Test private kernel method through collection proxy using has_many.
201
+ def self.open
202
+ where('firm_name = ?', '37signals')
203
+ end
204
+
205
+ before_destroy do |account|
206
+ if account.firm
207
+ Account.destroyed_account_ids[account.firm.id] << account.id
208
+ end
209
+ true
210
+ end
211
+
212
+ validate :check_empty_credit_limit
213
+
214
+ protected
215
+
216
+ def check_empty_credit_limit
217
+ errors.add_on_empty "credit_limit"
218
+ end
219
+
220
+ private
221
+
222
+ def private_method
223
+ "Sir, yes sir!"
224
+ end
225
+ end