activerecord 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,161 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/author'
5
- require 'models/category'
6
- require 'models/project'
7
- require 'models/developer'
8
-
9
- class AssociationCallbacksTest < ActiveRecord::TestCase
10
- fixtures :posts, :authors, :projects, :developers
11
-
12
- def setup
13
- @david = authors(:david)
14
- @thinking = posts(:thinking)
15
- @authorless = posts(:authorless)
16
- assert @david.post_log.empty?
17
- end
18
-
19
- def test_adding_macro_callbacks
20
- @david.posts_with_callbacks << @thinking
21
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
22
- @david.posts_with_callbacks << @thinking
23
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
24
- "after_adding#{@thinking.id}"], @david.post_log
25
- end
26
-
27
- def test_adding_with_proc_callbacks
28
- @david.posts_with_proc_callbacks << @thinking
29
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
30
- @david.posts_with_proc_callbacks << @thinking
31
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
32
- "after_adding#{@thinking.id}"], @david.post_log
33
- end
34
-
35
- def test_removing_with_macro_callbacks
36
- first_post, second_post = @david.posts_with_callbacks[0, 2]
37
- @david.posts_with_callbacks.delete(first_post)
38
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
39
- @david.posts_with_callbacks.delete(second_post)
40
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
41
- "after_removing#{second_post.id}"], @david.post_log
42
- end
43
-
44
- def test_removing_with_proc_callbacks
45
- first_post, second_post = @david.posts_with_callbacks[0, 2]
46
- @david.posts_with_proc_callbacks.delete(first_post)
47
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
48
- @david.posts_with_proc_callbacks.delete(second_post)
49
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
50
- "after_removing#{second_post.id}"], @david.post_log
51
- end
52
-
53
- def test_multiple_callbacks
54
- @david.posts_with_multiple_callbacks << @thinking
55
- assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
56
- "after_adding_proc#{@thinking.id}"], @david.post_log
57
- @david.posts_with_multiple_callbacks << @thinking
58
- assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
59
- "after_adding_proc#{@thinking.id}", "before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}",
60
- "after_adding#{@thinking.id}", "after_adding_proc#{@thinking.id}"], @david.post_log
61
- end
62
-
63
- def test_has_many_callbacks_with_create
64
- morten = Author.create :name => "Morten"
65
- post = morten.posts_with_proc_callbacks.create! :title => "Hello", :body => "How are you doing?"
66
- assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
67
- end
68
-
69
- def test_has_many_callbacks_with_create!
70
- morten = Author.create! :name => "Morten"
71
- post = morten.posts_with_proc_callbacks.create :title => "Hello", :body => "How are you doing?"
72
- assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
73
- end
74
-
75
- def test_has_many_callbacks_for_save_on_parent
76
- jack = Author.new :name => "Jack"
77
- post = jack.posts_with_callbacks.build :title => "Call me back!", :body => "Before you wake up and after you sleep"
78
-
79
- callback_log = ["before_adding<new>", "after_adding#{jack.posts_with_callbacks.first.id}"]
80
- assert_equal callback_log, jack.post_log
81
- assert jack.save
82
- assert_equal 1, jack.posts_with_callbacks.count
83
- assert_equal callback_log, jack.post_log
84
- end
85
-
86
- def test_has_and_belongs_to_many_add_callback
87
- david = developers(:david)
88
- ar = projects(:active_record)
89
- assert ar.developers_log.empty?
90
- ar.developers_with_callbacks << david
91
- assert_equal ["before_adding#{david.id}", "after_adding#{david.id}"], ar.developers_log
92
- ar.developers_with_callbacks << david
93
- assert_equal ["before_adding#{david.id}", "after_adding#{david.id}", "before_adding#{david.id}",
94
- "after_adding#{david.id}"], ar.developers_log
95
- end
96
-
97
- def test_has_and_belongs_to_many_after_add_called_after_save
98
- ar = projects(:active_record)
99
- assert ar.developers_log.empty?
100
- alice = Developer.new(:name => 'alice')
101
- ar.developers_with_callbacks << alice
102
- assert_equal"after_adding#{alice.id}", ar.developers_log.last
103
-
104
- bob = ar.developers_with_callbacks.create(:name => 'bob')
105
- assert_equal "after_adding#{bob.id}", ar.developers_log.last
106
-
107
- ar.developers_with_callbacks.build(:name => 'charlie')
108
- assert_equal "after_adding<new>", ar.developers_log.last
109
- end
110
-
111
-
112
- def test_has_and_belongs_to_many_remove_callback
113
- david = developers(:david)
114
- jamis = developers(:jamis)
115
- activerecord = projects(:active_record)
116
- assert activerecord.developers_log.empty?
117
- activerecord.developers_with_callbacks.delete(david)
118
- assert_equal ["before_removing#{david.id}", "after_removing#{david.id}"], activerecord.developers_log
119
-
120
- activerecord.developers_with_callbacks.delete(jamis)
121
- assert_equal ["before_removing#{david.id}", "after_removing#{david.id}", "before_removing#{jamis.id}",
122
- "after_removing#{jamis.id}"], activerecord.developers_log
123
- end
124
-
125
- def test_has_and_belongs_to_many_remove_callback_on_clear
126
- activerecord = projects(:active_record)
127
- assert activerecord.developers_log.empty?
128
- if activerecord.developers_with_callbacks.size == 0
129
- activerecord.developers << developers(:david)
130
- activerecord.developers << developers(:jamis)
131
- activerecord.reload
132
- assert activerecord.developers_with_callbacks.size == 2
133
- end
134
- log_array = activerecord.developers_with_callbacks.collect {|d| ["before_removing#{d.id}","after_removing#{d.id}"]}.flatten.sort
135
- assert activerecord.developers_with_callbacks.clear
136
- assert_equal log_array, activerecord.developers_log.sort
137
- end
138
-
139
- def test_has_many_and_belongs_to_many_callbacks_for_save_on_parent
140
- project = Project.new :name => "Callbacks"
141
- project.developers_with_callbacks.build :name => "Jack", :salary => 95000
142
-
143
- callback_log = ["before_adding<new>", "after_adding<new>"]
144
- assert_equal callback_log, project.developers_log
145
- assert project.save
146
- assert_equal 1, project.developers_with_callbacks.size
147
- assert_equal callback_log, project.developers_log
148
- end
149
-
150
- def test_dont_add_if_before_callback_raises_exception
151
- assert !@david.unchangable_posts.include?(@authorless)
152
- begin
153
- @david.unchangable_posts << @authorless
154
- rescue Exception => e
155
- end
156
- assert @david.post_log.empty?
157
- assert !@david.unchangable_posts.include?(@authorless)
158
- @david.reload
159
- assert !@david.unchangable_posts.include?(@authorless)
160
- end
161
- end
@@ -1,131 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/author'
5
- require 'models/category'
6
- require 'models/categorization'
7
- require 'models/company'
8
- require 'models/topic'
9
- require 'models/reply'
10
-
11
- class CascadedEagerLoadingTest < ActiveRecord::TestCase
12
- fixtures :authors, :mixins, :companies, :posts, :topics, :accounts, :comments, :categorizations
13
-
14
- def test_eager_association_loading_with_cascaded_two_levels
15
- authors = Author.find(:all, :include=>{:posts=>:comments}, :order=>"authors.id")
16
- assert_equal 2, authors.size
17
- assert_equal 5, authors[0].posts.size
18
- assert_equal 1, authors[1].posts.size
19
- assert_equal 9, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
20
- end
21
-
22
- def test_eager_association_loading_with_cascaded_two_levels_and_one_level
23
- authors = Author.find(:all, :include=>[{:posts=>:comments}, :categorizations], :order=>"authors.id")
24
- assert_equal 2, authors.size
25
- assert_equal 5, authors[0].posts.size
26
- assert_equal 1, authors[1].posts.size
27
- assert_equal 9, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
28
- assert_equal 1, authors[0].categorizations.size
29
- assert_equal 2, authors[1].categorizations.size
30
- end
31
-
32
- def test_eager_association_loading_with_cascaded_two_levels_with_two_has_many_associations
33
- authors = Author.find(:all, :include=>{:posts=>[:comments, :categorizations]}, :order=>"authors.id")
34
- assert_equal 2, authors.size
35
- assert_equal 5, authors[0].posts.size
36
- assert_equal 1, authors[1].posts.size
37
- assert_equal 9, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
38
- end
39
-
40
- def test_eager_association_loading_with_cascaded_two_levels_and_self_table_reference
41
- authors = Author.find(:all, :include=>{:posts=>[:comments, :author]}, :order=>"authors.id")
42
- assert_equal 2, authors.size
43
- assert_equal 5, authors[0].posts.size
44
- assert_equal authors(:david).name, authors[0].name
45
- assert_equal [authors(:david).name], authors[0].posts.collect{|post| post.author.name}.uniq
46
- end
47
-
48
- def test_eager_association_loading_with_cascaded_two_levels_with_condition
49
- authors = Author.find(:all, :include=>{:posts=>:comments}, :conditions=>"authors.id=1", :order=>"authors.id")
50
- assert_equal 1, authors.size
51
- assert_equal 5, authors[0].posts.size
52
- end
53
-
54
- def test_eager_association_loading_with_cascaded_three_levels_by_ping_pong
55
- firms = Firm.find(:all, :include=>{:account=>{:firm=>:account}}, :order=>"companies.id")
56
- assert_equal 2, firms.size
57
- assert_equal firms.first.account, firms.first.account.firm.account
58
- assert_equal companies(:first_firm).account, assert_no_queries { firms.first.account.firm.account }
59
- assert_equal companies(:first_firm).account.firm.account, assert_no_queries { firms.first.account.firm.account }
60
- end
61
-
62
- def test_eager_association_loading_with_has_many_sti
63
- topics = Topic.find(:all, :include => :replies, :order => 'topics.id')
64
- first, second, = topics(:first).replies.size, topics(:second).replies.size
65
- assert_no_queries do
66
- assert_equal first, topics[0].replies.size
67
- assert_equal second, topics[1].replies.size
68
- end
69
- end
70
-
71
- def test_eager_association_loading_with_has_many_sti_and_subclasses
72
- silly = SillyReply.new(:title => "gaga", :content => "boo-boo", :parent_id => 1)
73
- silly.parent_id = 1
74
- assert silly.save
75
-
76
- topics = Topic.find(:all, :include => :replies, :order => 'topics.id, replies_topics.id')
77
- assert_no_queries do
78
- assert_equal 2, topics[0].replies.size
79
- assert_equal 0, topics[1].replies.size
80
- end
81
- end
82
-
83
- def test_eager_association_loading_with_belongs_to_sti
84
- replies = Reply.find(:all, :include => :topic, :order => 'topics.id')
85
- assert replies.include?(topics(:second))
86
- assert !replies.include?(topics(:first))
87
- assert_equal topics(:first), assert_no_queries { replies.first.topic }
88
- end
89
-
90
- def test_eager_association_loading_with_multiple_stis_and_order
91
- author = Author.find(:first, :include => { :posts => [ :special_comments , :very_special_comment ] }, :order => 'authors.name, comments.body, very_special_comments_posts.body', :conditions => 'posts.id = 4')
92
- assert_equal authors(:david), author
93
- assert_no_queries do
94
- author.posts.first.special_comments
95
- author.posts.first.very_special_comment
96
- end
97
- end
98
-
99
- def test_eager_association_loading_of_stis_with_multiple_references
100
- authors = Author.find(:all, :include => { :posts => { :special_comments => { :post => [ :special_comments, :very_special_comment ] } } }, :order => 'comments.body, very_special_comments_posts.body', :conditions => 'posts.id = 4')
101
- assert_equal [authors(:david)], authors
102
- assert_no_queries do
103
- authors.first.posts.first.special_comments.first.post.special_comments
104
- authors.first.posts.first.special_comments.first.post.very_special_comment
105
- end
106
- end
107
-
108
- def test_eager_association_loading_where_first_level_returns_nil
109
- authors = Author.find(:all, :include => {:post_about_thinking => :comments}, :order => 'authors.id DESC')
110
- assert_equal [authors(:mary), authors(:david)], authors
111
- assert_no_queries do
112
- authors[1].post_about_thinking.comments.first
113
- end
114
- end
115
- end
116
-
117
- require 'models/vertex'
118
- require 'models/edge'
119
- class CascadedEagerLoadingTest < ActiveRecord::TestCase
120
- fixtures :edges, :vertices
121
-
122
- def test_eager_association_loading_with_recursive_cascading_four_levels_has_many_through
123
- source = Vertex.find(:first, :include=>{:sinks=>{:sinks=>{:sinks=>:sinks}}}, :order => 'vertices.id')
124
- assert_equal vertices(:vertex_4), assert_no_queries { source.sinks.first.sinks.first.sinks.first }
125
- end
126
-
127
- def test_eager_association_loading_with_recursive_cascading_four_levels_has_and_belongs_to_many
128
- sink = Vertex.find(:first, :include=>{:sources=>{:sources=>{:sources=>:sources}}}, :order => 'vertices.id DESC')
129
- assert_equal vertices(:vertex_1), assert_no_queries { sink.sources.first.sources.first.sources.first.sources.first }
130
- end
131
- end
@@ -1,36 +0,0 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/tagging'
4
-
5
- module Namespaced
6
- class Post < ActiveRecord::Base
7
- set_table_name 'posts'
8
- has_one :tagging, :as => :taggable, :class_name => 'Tagging'
9
- end
10
- end
11
-
12
- class EagerLoadIncludeFullStiClassNamesTest < ActiveRecord::TestCase
13
-
14
- def setup
15
- generate_test_objects
16
- end
17
-
18
- def generate_test_objects
19
- post = Namespaced::Post.create( :title => 'Great stuff', :body => 'This is not', :author_id => 1 )
20
- tagging = Tagging.create( :taggable => post )
21
- end
22
-
23
- def test_class_names
24
- old = ActiveRecord::Base.store_full_sti_class
25
-
26
- ActiveRecord::Base.store_full_sti_class = false
27
- post = Namespaced::Post.find_by_title( 'Great stuff', :include => :tagging )
28
- assert_nil post.tagging
29
-
30
- ActiveRecord::Base.store_full_sti_class = true
31
- post = Namespaced::Post.find_by_title( 'Great stuff', :include => :tagging )
32
- assert_equal 'Tagging', post.tagging.class.name
33
- ensure
34
- ActiveRecord::Base.store_full_sti_class = old
35
- end
36
- end
@@ -1,131 +0,0 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/author'
4
- require 'models/comment'
5
- require 'models/category'
6
- require 'models/categorization'
7
- require 'active_support/core_ext/array/random_access'
8
-
9
- module Remembered
10
- def self.included(base)
11
- base.extend ClassMethods
12
- base.class_eval do
13
- after_create :remember
14
- protected
15
- def remember; self.class.remembered << self; end
16
- end
17
- end
18
-
19
- module ClassMethods
20
- def remembered; @@remembered ||= []; end
21
- def sample; @@remembered.sample; end
22
- end
23
- end
24
-
25
- class ShapeExpression < ActiveRecord::Base
26
- belongs_to :shape, :polymorphic => true
27
- belongs_to :paint, :polymorphic => true
28
- end
29
-
30
- class Circle < ActiveRecord::Base
31
- has_many :shape_expressions, :as => :shape
32
- include Remembered
33
- end
34
- class Square < ActiveRecord::Base
35
- has_many :shape_expressions, :as => :shape
36
- include Remembered
37
- end
38
- class Triangle < ActiveRecord::Base
39
- has_many :shape_expressions, :as => :shape
40
- include Remembered
41
- end
42
- class PaintColor < ActiveRecord::Base
43
- has_many :shape_expressions, :as => :paint
44
- belongs_to :non_poly, :foreign_key => "non_poly_one_id", :class_name => "NonPolyOne"
45
- include Remembered
46
- end
47
- class PaintTexture < ActiveRecord::Base
48
- has_many :shape_expressions, :as => :paint
49
- belongs_to :non_poly, :foreign_key => "non_poly_two_id", :class_name => "NonPolyTwo"
50
- include Remembered
51
- end
52
- class NonPolyOne < ActiveRecord::Base
53
- has_many :paint_colors
54
- include Remembered
55
- end
56
- class NonPolyTwo < ActiveRecord::Base
57
- has_many :paint_textures
58
- include Remembered
59
- end
60
-
61
-
62
-
63
- class EagerLoadPolyAssocsTest < ActiveRecord::TestCase
64
- NUM_SIMPLE_OBJS = 50
65
- NUM_SHAPE_EXPRESSIONS = 100
66
-
67
- def setup
68
- generate_test_object_graphs
69
- end
70
-
71
- def teardown
72
- [Circle, Square, Triangle, PaintColor, PaintTexture,
73
- ShapeExpression, NonPolyOne, NonPolyTwo].each do |c|
74
- c.delete_all
75
- end
76
-
77
- end
78
-
79
-
80
- def generate_test_object_graphs
81
- 1.upto(NUM_SIMPLE_OBJS) do
82
- [Circle, Square, Triangle, NonPolyOne, NonPolyTwo].map(&:create!)
83
- end
84
- 1.upto(NUM_SIMPLE_OBJS) do
85
- PaintColor.create!(:non_poly_one_id => NonPolyOne.sample.id)
86
- PaintTexture.create!(:non_poly_two_id => NonPolyTwo.sample.id)
87
- end
88
- 1.upto(NUM_SHAPE_EXPRESSIONS) do
89
- shape_type = [Circle, Square, Triangle].sample
90
- paint_type = [PaintColor, PaintTexture].sample
91
- ShapeExpression.create!(:shape_type => shape_type.to_s, :shape_id => shape_type.sample.id,
92
- :paint_type => paint_type.to_s, :paint_id => paint_type.sample.id)
93
- end
94
- end
95
-
96
- def test_include_query
97
- res = 0
98
- res = ShapeExpression.find :all, :include => [ :shape, { :paint => :non_poly } ]
99
- assert_equal NUM_SHAPE_EXPRESSIONS, res.size
100
- assert_queries(0) do
101
- res.each do |se|
102
- assert_not_nil se.paint.non_poly, "this is the association that was loading incorrectly before the change"
103
- assert_not_nil se.shape, "just making sure other associations still work"
104
- end
105
- end
106
- end
107
- end
108
-
109
- class EagerLoadNestedIncludeWithMissingDataTest < ActiveRecord::TestCase
110
- def setup
111
- @davey_mcdave = Author.create(:name => 'Davey McDave')
112
- @first_post = @davey_mcdave.posts.create(:title => 'Davey Speaks', :body => 'Expressive wordage')
113
- @first_comment = @first_post.comments.create(:body => 'Inflamatory doublespeak')
114
- @first_categorization = @davey_mcdave.categorizations.create(:category => Category.first, :post => @first_post)
115
- end
116
-
117
- def teardown
118
- @davey_mcdave.destroy
119
- @first_post.destroy
120
- @first_comment.destroy
121
- @first_categorization.destroy
122
- end
123
-
124
- def test_missing_data_in_a_nested_include_should_not_cause_errors_when_constructing_objects
125
- assert_nothing_raised do
126
- # @davey_mcdave doesn't have any author_favorites
127
- includes = {:posts => :comments, :categorizations => :category, :author_favorites => :favorite_author }
128
- Author.all :include => includes, :conditions => {:authors => {:name => @davey_mcdave.name}}, :order => 'categories.name'
129
- end
130
- end
131
- end