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
@@ -0,0 +1,47 @@
1
+ module ActiveRecord
2
+ module Validations
3
+ class AssociatedValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ return if (value.is_a?(Array) ? value : [value]).collect{ |r| r.nil? || r.valid? }.all?
6
+ record.errors.add(attribute, :invalid, :default => options[:message], :value => value)
7
+ end
8
+ end
9
+
10
+ module ClassMethods
11
+ # Validates whether the associated object or objects are all valid themselves. Works with any kind of association.
12
+ #
13
+ # class Book < ActiveRecord::Base
14
+ # has_many :pages
15
+ # belongs_to :library
16
+ #
17
+ # validates_associated :pages, :library
18
+ # end
19
+ #
20
+ # Warning: If, after the above definition, you then wrote:
21
+ #
22
+ # class Page < ActiveRecord::Base
23
+ # belongs_to :book
24
+ #
25
+ # validates_associated :book
26
+ # end
27
+ #
28
+ # this would specify a circular dependency and cause infinite recursion.
29
+ #
30
+ # NOTE: This validation will not fail if the association hasn't been assigned. If you want to ensure that the association
31
+ # is both present and guaranteed to be valid, you also need to use +validates_presence_of+.
32
+ #
33
+ # Configuration options:
34
+ # * <tt>:message</tt> - A custom error message (default is: "is invalid")
35
+ # * <tt>:on</tt> - Specifies when this validation is active (default is <tt>:save</tt>, other options <tt>:create</tt>, <tt>:update</tt>).
36
+ # * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
37
+ # occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
38
+ # method, proc or string should return or evaluate to a true or false value.
39
+ # * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
40
+ # not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
41
+ # method, proc or string should return or evaluate to a true or false value.
42
+ def validates_associated(*attr_names)
43
+ validates_with AssociatedValidator, _merge_attributes(attr_names)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,181 @@
1
+ module ActiveRecord
2
+ module Validations
3
+ class UniquenessValidator < ActiveModel::EachValidator
4
+ def initialize(options)
5
+ super(options.reverse_merge(:case_sensitive => true))
6
+ end
7
+
8
+ # Unfortunately, we have to tie Uniqueness validators to a class.
9
+ def setup(klass)
10
+ @klass = klass
11
+ end
12
+
13
+ def validate_each(record, attribute, value)
14
+ finder_class = find_finder_class_for(record)
15
+ table = finder_class.unscoped
16
+
17
+ table_name = record.class.quoted_table_name
18
+ sql, params = mount_sql_and_params(finder_class, table_name, attribute, value)
19
+
20
+ relation = table.where(sql, *params)
21
+
22
+ Array(options[:scope]).each do |scope_item|
23
+ scope_value = record.send(scope_item)
24
+ relation = relation.where(scope_item => scope_value)
25
+ end
26
+
27
+ unless record.new_record?
28
+ # TODO : This should be in Arel
29
+ relation = relation.where("#{record.class.quoted_table_name}.#{record.class.primary_key} <> ?", record.send(:id))
30
+ end
31
+
32
+ if relation.exists?
33
+ record.errors.add(attribute, :taken, :default => options[:message], :value => value)
34
+ end
35
+ end
36
+
37
+ protected
38
+
39
+ # The check for an existing value should be run from a class that
40
+ # isn't abstract. This means working down from the current class
41
+ # (self), to the first non-abstract class. Since classes don't know
42
+ # their subclasses, we have to build the hierarchy between self and
43
+ # the record's class.
44
+ def find_finder_class_for(record) #:nodoc:
45
+ class_hierarchy = [record.class]
46
+
47
+ while class_hierarchy.first != @klass
48
+ class_hierarchy.insert(0, class_hierarchy.first.superclass)
49
+ end
50
+
51
+ class_hierarchy.detect { |klass| !klass.abstract_class? }
52
+ end
53
+
54
+ def mount_sql_and_params(klass, table_name, attribute, value) #:nodoc:
55
+ column = klass.columns_hash[attribute.to_s]
56
+
57
+ operator = if value.nil?
58
+ "IS ?"
59
+ elsif column.text?
60
+ value = column.limit ? value.to_s.mb_chars[0, column.limit] : value.to_s
61
+ "#{klass.connection.case_sensitive_equality_operator} ?"
62
+ else
63
+ "= ?"
64
+ end
65
+
66
+ sql_attribute = "#{table_name}.#{klass.connection.quote_column_name(attribute)}"
67
+
68
+ if value.nil? || (options[:case_sensitive] || !column.text?)
69
+ sql = "#{sql_attribute} #{operator}"
70
+ params = [value]
71
+ else
72
+ sql = "LOWER(#{sql_attribute}) #{operator}"
73
+ params = [value.mb_chars.downcase]
74
+ end
75
+
76
+ [sql, params]
77
+ end
78
+ end
79
+
80
+ module ClassMethods
81
+ # Validates whether the value of the specified attributes are unique across the system. Useful for making sure that only one user
82
+ # can be named "davidhh".
83
+ #
84
+ # class Person < ActiveRecord::Base
85
+ # validates_uniqueness_of :user_name, :scope => :account_id
86
+ # end
87
+ #
88
+ # It can also validate whether the value of the specified attributes are unique based on multiple scope parameters. For example,
89
+ # making sure that a teacher can only be on the schedule once per semester for a particular class.
90
+ #
91
+ # class TeacherSchedule < ActiveRecord::Base
92
+ # validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
93
+ # end
94
+ #
95
+ # When the record is created, a check is performed to make sure that no record exists in the database with the given value for the specified
96
+ # attribute (that maps to a column). When the record is updated, the same check is made but disregarding the record itself.
97
+ #
98
+ # Configuration options:
99
+ # * <tt>:message</tt> - Specifies a custom error message (default is: "has already been taken").
100
+ # * <tt>:scope</tt> - One or more columns by which to limit the scope of the uniqueness constraint.
101
+ # * <tt>:case_sensitive</tt> - Looks for an exact match. Ignored by non-text columns (+true+ by default).
102
+ # * <tt>:allow_nil</tt> - If set to true, skips this validation if the attribute is +nil+ (default is +false+).
103
+ # * <tt>:allow_blank</tt> - If set to true, skips this validation if the attribute is blank (default is +false+).
104
+ # * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
105
+ # occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
106
+ # method, proc or string should return or evaluate to a true or false value.
107
+ # * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
108
+ # not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
109
+ # method, proc or string should return or evaluate to a true or false value.
110
+ #
111
+ # === Concurrency and integrity
112
+ #
113
+ # Using this validation method in conjunction with ActiveRecord::Base#save
114
+ # does not guarantee the absence of duplicate record insertions, because
115
+ # uniqueness checks on the application level are inherently prone to race
116
+ # conditions. For example, suppose that two users try to post a Comment at
117
+ # the same time, and a Comment's title must be unique. At the database-level,
118
+ # the actions performed by these users could be interleaved in the following manner:
119
+ #
120
+ # User 1 | User 2
121
+ # ------------------------------------+--------------------------------------
122
+ # # User 1 checks whether there's |
123
+ # # already a comment with the title |
124
+ # # 'My Post'. This is not the case. |
125
+ # SELECT * FROM comments |
126
+ # WHERE title = 'My Post' |
127
+ # |
128
+ # | # User 2 does the same thing and also
129
+ # | # infers that his title is unique.
130
+ # | SELECT * FROM comments
131
+ # | WHERE title = 'My Post'
132
+ # |
133
+ # # User 1 inserts his comment. |
134
+ # INSERT INTO comments |
135
+ # (title, content) VALUES |
136
+ # ('My Post', 'hi!') |
137
+ # |
138
+ # | # User 2 does the same thing.
139
+ # | INSERT INTO comments
140
+ # | (title, content) VALUES
141
+ # | ('My Post', 'hello!')
142
+ # |
143
+ # | # ^^^^^^
144
+ # | # Boom! We now have a duplicate
145
+ # | # title!
146
+ #
147
+ # This could even happen if you use transactions with the 'serializable'
148
+ # isolation level. There are several ways to get around this problem:
149
+ #
150
+ # - By locking the database table before validating, and unlocking it after
151
+ # saving. However, table locking is very expensive, and thus not
152
+ # recommended.
153
+ # - By locking a lock file before validating, and unlocking it after saving.
154
+ # This does not work if you've scaled your Rails application across
155
+ # multiple web servers (because they cannot share lock files, or cannot
156
+ # do that efficiently), and thus not recommended.
157
+ # - Creating a unique index on the field, by using
158
+ # ActiveRecord::ConnectionAdapters::SchemaStatements#add_index. In the
159
+ # rare case that a race condition occurs, the database will guarantee
160
+ # the field's uniqueness.
161
+ #
162
+ # When the database catches such a duplicate insertion,
163
+ # ActiveRecord::Base#save will raise an ActiveRecord::StatementInvalid
164
+ # exception. You can either choose to let this error propagate (which
165
+ # will result in the default Rails exception page being shown), or you
166
+ # can catch it and restart the transaction (e.g. by telling the user
167
+ # that the title already exists, and asking him to re-enter the title).
168
+ # This technique is also known as optimistic concurrency control:
169
+ # http://en.wikipedia.org/wiki/Optimistic_concurrency_control
170
+ #
171
+ # Active Record currently provides no way to distinguish unique
172
+ # index constraint errors from other types of database errors, so you
173
+ # will have to parse the (database-specific) exception message to detect
174
+ # such a case.
175
+ #
176
+ def validates_uniqueness_of(*attr_names)
177
+ validates_with UniquenessValidator, _merge_attributes(attr_names)
178
+ end
179
+ end
180
+ end
181
+ end
@@ -1,8 +1,8 @@
1
1
  module ActiveRecord
2
2
  module VERSION #:nodoc:
3
- MAJOR = 2
4
- MINOR = 3
5
- TINY = 18
3
+ MAJOR = 3
4
+ MINOR = 0
5
+ TINY = "0.beta"
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,30 @@
1
+ require 'rails/generators/named_base'
2
+ require 'rails/generators/migration'
3
+ require 'rails/generators/active_model'
4
+ require 'active_record'
5
+
6
+ module ActiveRecord
7
+ module Generators
8
+ class Base < Rails::Generators::NamedBase #:nodoc:
9
+ include Rails::Generators::Migration
10
+
11
+ def self.source_root
12
+ @_ar_source_root ||= begin
13
+ if base_name && generator_name
14
+ File.expand_path(File.join(base_name, generator_name, 'templates'), File.dirname(__FILE__))
15
+ end
16
+ end
17
+ end
18
+
19
+ # Implement the required interface for Rails::Generators::Migration.
20
+ #
21
+ def self.next_migration_number(dirname) #:nodoc:
22
+ if ActiveRecord::Base.timestamped_migrations
23
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
24
+ else
25
+ "%.3d" % (current_migration_number(dirname) + 1)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ require 'generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class MigrationGenerator < Base
6
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
7
+
8
+ def create_migration_file
9
+ set_local_assigns!
10
+ migration_template "migration.rb", "db/migrate/#{file_name}.rb"
11
+ end
12
+
13
+ protected
14
+ attr_reader :migration_action
15
+
16
+ def set_local_assigns!
17
+ if file_name =~ /^(add|remove)_.*_(?:to|from)_(.*)/
18
+ @migration_action = $1
19
+ @table_name = $2.pluralize
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration
2
+ def self.up<% attributes.each do |attribute| %>
3
+ <%= migration_action %>_column :<%= table_name %>, :<%= attribute.name %><% if migration_action == 'add' %>, :<%= attribute.type %><% end -%>
4
+ <%- end %>
5
+ end
6
+
7
+ def self.down<% attributes.reverse.each do |attribute| %>
8
+ <%= migration_action == 'add' ? 'remove' : 'add' %>_column :<%= table_name %>, :<%= attribute.name %><% if migration_action == 'remove' %>, :<%= attribute.type %><% end -%>
9
+ <%- end %>
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ require 'generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class ModelGenerator < Base
6
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
7
+
8
+ check_class_collision
9
+
10
+ class_option :migration, :type => :boolean
11
+ class_option :timestamps, :type => :boolean
12
+ class_option :parent, :type => :string, :desc => "The parent class for the generated model"
13
+
14
+ def create_migration_file
15
+ return unless options[:migration] && options[:parent].nil?
16
+ migration_template "migration.rb", "db/migrate/create_#{table_name}.rb"
17
+ end
18
+
19
+ def create_model_file
20
+ template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
21
+ end
22
+
23
+ hook_for :test_framework
24
+
25
+ protected
26
+
27
+ def parent_class_name
28
+ options[:parent] || "ActiveRecord::Base"
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= table_name %> do |t|
4
+ <% for attribute in attributes -%>
5
+ t.<%= attribute.type %> :<%= attribute.name %>
6
+ <% end -%>
7
+ <% if options[:timestamps] %>
8
+ t.timestamps
9
+ <% end -%>
10
+ end
11
+ end
12
+
13
+ def self.down
14
+ drop_table :<%= table_name %>
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ class <%= class_name %> < <%= parent_class_name.classify %>
2
+ <% attributes.select {|attr| attr.reference? }.each do |attribute| -%>
3
+ belongs_to :<%= attribute.name %>
4
+ <% end -%>
5
+ end
@@ -0,0 +1,15 @@
1
+ require 'generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class ObserverGenerator < Base
6
+ check_class_collision :suffix => "Observer"
7
+
8
+ def create_observer_file
9
+ template 'observer.rb', File.join('app/models', class_path, "#{file_name}_observer.rb")
10
+ end
11
+
12
+ hook_for :test_framework
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,2 @@
1
+ class <%= class_name %>Observer < ActiveRecord::Observer
2
+ end
@@ -0,0 +1,24 @@
1
+ require 'generators/active_record'
2
+
3
+ module ActiveRecord
4
+ module Generators
5
+ class SessionMigrationGenerator < Base
6
+ argument :name, :type => :string, :default => "add_sessions_table"
7
+
8
+ def create_migration_file
9
+ migration_template "migration.rb", "db/migrate/#{file_name}.rb"
10
+ end
11
+
12
+ protected
13
+
14
+ def session_table_name
15
+ current_table_name = ActiveRecord::SessionStore::Session.table_name
16
+ if ["sessions", "session"].include?(current_table_name)
17
+ current_table_name = (ActiveRecord::Base.pluralize_table_names ? 'session'.pluralize : 'session')
18
+ end
19
+ current_table_name
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= session_table_name %> do |t|
4
+ t.string :session_id, :null => false
5
+ t.text :data
6
+ t.timestamps
7
+ end
8
+
9
+ add_index :<%= session_table_name %>, :session_id
10
+ add_index :<%= session_table_name %>, :updated_at
11
+ end
12
+
13
+ def self.down
14
+ drop_table :<%= session_table_name %>
15
+ end
16
+ end
metadata CHANGED
@@ -1,12 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 2
7
- - 3
8
- - 18
9
- version: 2.3.18
4
+ version: 3.0.0.beta
10
5
  platform: ruby
11
6
  authors:
12
7
  - David Heinemeier Hansson
@@ -14,24 +9,40 @@ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
11
 
17
- date: 2013-03-18 00:00:00 -07:00
12
+ date: 2010-02-04 00:00:00 -08:00
18
13
  default_executable:
19
14
  dependencies:
20
15
  - !ruby/object:Gem::Dependency
21
16
  name: activesupport
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
24
20
  requirements:
25
21
  - - "="
26
22
  - !ruby/object:Gem::Version
27
- segments:
28
- - 2
29
- - 3
30
- - 18
31
- version: 2.3.18
23
+ version: 3.0.0.beta
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: activemodel
32
27
  type: :runtime
33
- version_requirements: *id001
34
- description: Implements the ActiveRecord pattern (Fowler, PoEAA) for ORM. It ties database tables and classes together for business objects, like Customer or Subscription, that can find, save, and destroy themselves without resorting to manual SQL.
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.0.0.beta
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: arel
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 0.2.0
44
+ version:
45
+ description: Object-relational mapper framework (part of Rails).
35
46
  email: david@loudthinking.com
36
47
  executables: []
37
48
 
@@ -40,11 +51,11 @@ extensions: []
40
51
  extra_rdoc_files:
41
52
  - README
42
53
  files:
43
- - Rakefile
44
- - install.rb
45
- - README
46
- - RUNNING_UNIT_TESTS
47
54
  - CHANGELOG
55
+ - README
56
+ - examples/associations.png
57
+ - examples/performance.rb
58
+ - examples/simple.rb
48
59
  - lib/active_record/aggregations.rb
49
60
  - lib/active_record/association_preload.rb
50
61
  - lib/active_record/associations/association_collection.rb
@@ -56,16 +67,22 @@ files:
56
67
  - lib/active_record/associations/has_many_through_association.rb
57
68
  - lib/active_record/associations/has_one_association.rb
58
69
  - lib/active_record/associations/has_one_through_association.rb
70
+ - lib/active_record/associations/through_association_scope.rb
59
71
  - lib/active_record/associations.rb
72
+ - lib/active_record/attribute_methods/before_type_cast.rb
73
+ - lib/active_record/attribute_methods/dirty.rb
74
+ - lib/active_record/attribute_methods/primary_key.rb
75
+ - lib/active_record/attribute_methods/query.rb
76
+ - lib/active_record/attribute_methods/read.rb
77
+ - lib/active_record/attribute_methods/time_zone_conversion.rb
78
+ - lib/active_record/attribute_methods/write.rb
60
79
  - lib/active_record/attribute_methods.rb
61
80
  - lib/active_record/autosave_association.rb
62
81
  - lib/active_record/base.rb
63
82
  - lib/active_record/batches.rb
64
- - lib/active_record/calculations.rb
65
83
  - lib/active_record/callbacks.rb
66
84
  - lib/active_record/connection_adapters/abstract/connection_pool.rb
67
85
  - lib/active_record/connection_adapters/abstract/connection_specification.rb
68
- - lib/active_record/connection_adapters/abstract/database_limits.rb
69
86
  - lib/active_record/connection_adapters/abstract/database_statements.rb
70
87
  - lib/active_record/connection_adapters/abstract/query_cache.rb
71
88
  - lib/active_record/connection_adapters/abstract/quoting.rb
@@ -76,7 +93,6 @@ files:
76
93
  - lib/active_record/connection_adapters/postgresql_adapter.rb
77
94
  - lib/active_record/connection_adapters/sqlite3_adapter.rb
78
95
  - lib/active_record/connection_adapters/sqlite_adapter.rb
79
- - lib/active_record/dirty.rb
80
96
  - lib/active_record/dynamic_finder_match.rb
81
97
  - lib/active_record/dynamic_scope_match.rb
82
98
  - lib/active_record/fixtures.rb
@@ -88,312 +104,40 @@ files:
88
104
  - lib/active_record/nested_attributes.rb
89
105
  - lib/active_record/observer.rb
90
106
  - lib/active_record/query_cache.rb
107
+ - lib/active_record/railtie.rb
108
+ - lib/active_record/railties/controller_runtime.rb
109
+ - lib/active_record/railties/databases.rake
110
+ - lib/active_record/railties/subscriber.rb
91
111
  - lib/active_record/reflection.rb
112
+ - lib/active_record/relation/calculations.rb
113
+ - lib/active_record/relation/finder_methods.rb
114
+ - lib/active_record/relation/predicate_builder.rb
115
+ - lib/active_record/relation/query_methods.rb
116
+ - lib/active_record/relation/spawn_methods.rb
117
+ - lib/active_record/relation.rb
92
118
  - lib/active_record/schema.rb
93
119
  - lib/active_record/schema_dumper.rb
94
120
  - lib/active_record/serialization.rb
95
- - lib/active_record/serializers/json_serializer.rb
96
121
  - lib/active_record/serializers/xml_serializer.rb
97
122
  - lib/active_record/session_store.rb
98
123
  - lib/active_record/test_case.rb
99
124
  - lib/active_record/timestamp.rb
100
125
  - lib/active_record/transactions.rb
126
+ - lib/active_record/validations/associated.rb
127
+ - lib/active_record/validations/uniqueness.rb
101
128
  - lib/active_record/validations.rb
102
129
  - lib/active_record/version.rb
103
130
  - lib/active_record.rb
104
- - lib/activerecord.rb
105
- - test/assets/example.log
106
- - test/assets/flowers.jpg
107
- - test/cases/aaa_create_tables_test.rb
108
- - test/cases/active_schema_test_mysql.rb
109
- - test/cases/active_schema_test_postgresql.rb
110
- - test/cases/adapter_test.rb
111
- - test/cases/aggregations_test.rb
112
- - test/cases/ar_schema_test.rb
113
- - test/cases/associations/belongs_to_associations_test.rb
114
- - test/cases/associations/callbacks_test.rb
115
- - test/cases/associations/cascaded_eager_loading_test.rb
116
- - test/cases/associations/eager_load_includes_full_sti_class_test.rb
117
- - test/cases/associations/eager_load_nested_include_test.rb
118
- - test/cases/associations/eager_load_nested_polymorphic_include.rb
119
- - test/cases/associations/eager_singularization_test.rb
120
- - test/cases/associations/eager_test.rb
121
- - test/cases/associations/extension_test.rb
122
- - test/cases/associations/habtm_join_table_test.rb
123
- - test/cases/associations/has_and_belongs_to_many_associations_test.rb
124
- - test/cases/associations/has_many_associations_test.rb
125
- - test/cases/associations/has_many_through_associations_test.rb
126
- - test/cases/associations/has_one_associations_test.rb
127
- - test/cases/associations/has_one_through_associations_test.rb
128
- - test/cases/associations/inner_join_association_test.rb
129
- - test/cases/associations/inverse_associations_test.rb
130
- - test/cases/associations/join_model_test.rb
131
- - test/cases/associations_test.rb
132
- - test/cases/attribute_methods_test.rb
133
- - test/cases/autosave_association_test.rb
134
- - test/cases/base_test.rb
135
- - test/cases/batches_test.rb
136
- - test/cases/binary_test.rb
137
- - test/cases/calculations_test.rb
138
- - test/cases/callbacks_observers_test.rb
139
- - test/cases/callbacks_test.rb
140
- - test/cases/class_inheritable_attributes_test.rb
141
- - test/cases/column_alias_test.rb
142
- - test/cases/column_definition_test.rb
143
- - test/cases/connection_pool_test.rb
144
- - test/cases/connection_test_firebird.rb
145
- - test/cases/connection_test_mysql.rb
146
- - test/cases/copy_table_test_sqlite.rb
147
- - test/cases/counter_cache_test.rb
148
- - test/cases/database_statements_test.rb
149
- - test/cases/datatype_test_postgresql.rb
150
- - test/cases/date_time_test.rb
151
- - test/cases/default_test_firebird.rb
152
- - test/cases/defaults_test.rb
153
- - test/cases/deprecated_finder_test.rb
154
- - test/cases/dirty_test.rb
155
- - test/cases/finder_respond_to_test.rb
156
- - test/cases/finder_test.rb
157
- - test/cases/fixtures_test.rb
158
- - test/cases/helper.rb
159
- - test/cases/i18n_test.rb
160
- - test/cases/inheritance_test.rb
161
- - test/cases/invalid_date_test.rb
162
- - test/cases/json_serialization_test.rb
163
- - test/cases/lifecycle_test.rb
164
- - test/cases/locking_test.rb
165
- - test/cases/method_scoping_test.rb
166
- - test/cases/migration_test.rb
167
- - test/cases/migration_test_firebird.rb
168
- - test/cases/mixin_test.rb
169
- - test/cases/modules_test.rb
170
- - test/cases/multiple_db_test.rb
171
- - test/cases/named_scope_test.rb
172
- - test/cases/nested_attributes_test.rb
173
- - test/cases/pk_test.rb
174
- - test/cases/pooled_connections_test.rb
175
- - test/cases/query_cache_test.rb
176
- - test/cases/readonly_test.rb
177
- - test/cases/reflection_test.rb
178
- - test/cases/reload_models_test.rb
179
- - test/cases/repair_helper.rb
180
- - test/cases/reserved_word_test_mysql.rb
181
- - test/cases/sanitize_test.rb
182
- - test/cases/schema_authorization_test_postgresql.rb
183
- - test/cases/schema_dumper_test.rb
184
- - test/cases/schema_test_postgresql.rb
185
- - test/cases/serialization_test.rb
186
- - test/cases/sp_test_mysql.rb
187
- - test/cases/synonym_test_oracle.rb
188
- - test/cases/timestamp_test.rb
189
- - test/cases/transactions_test.rb
190
- - test/cases/unconnected_test.rb
191
- - test/cases/validations_i18n_test.rb
192
- - test/cases/validations_test.rb
193
- - test/cases/xml_serialization_test.rb
194
- - test/cases/yaml_serialization_test.rb
195
- - test/config.rb
196
- - test/connections/jdbc_jdbcderby/connection.rb
197
- - test/connections/jdbc_jdbch2/connection.rb
198
- - test/connections/jdbc_jdbchsqldb/connection.rb
199
- - test/connections/jdbc_jdbcmysql/connection.rb
200
- - test/connections/jdbc_jdbcpostgresql/connection.rb
201
- - test/connections/jdbc_jdbcsqlite3/connection.rb
202
- - test/connections/native_db2/connection.rb
203
- - test/connections/native_firebird/connection.rb
204
- - test/connections/native_frontbase/connection.rb
205
- - test/connections/native_mysql/connection.rb
206
- - test/connections/native_openbase/connection.rb
207
- - test/connections/native_oracle/connection.rb
208
- - test/connections/native_postgresql/connection.rb
209
- - test/connections/native_sqlite/connection.rb
210
- - test/connections/native_sqlite3/connection.rb
211
- - test/connections/native_sqlite3/in_memory_connection.rb
212
- - test/connections/native_sybase/connection.rb
213
- - test/fixtures/accounts.yml
214
- - test/fixtures/all/developers.yml
215
- - test/fixtures/all/people.csv
216
- - test/fixtures/all/tasks.yml
217
- - test/fixtures/author_addresses.yml
218
- - test/fixtures/author_favorites.yml
219
- - test/fixtures/authors.yml
220
- - test/fixtures/binaries.yml
221
- - test/fixtures/books.yml
222
- - test/fixtures/categories/special_categories.yml
223
- - test/fixtures/categories/subsubdir/arbitrary_filename.yml
224
- - test/fixtures/categories.yml
225
- - test/fixtures/categories_ordered.yml
226
- - test/fixtures/categories_posts.yml
227
- - test/fixtures/categorizations.yml
228
- - test/fixtures/clubs.yml
229
- - test/fixtures/comments.yml
230
- - test/fixtures/companies.yml
231
- - test/fixtures/computers.yml
232
- - test/fixtures/courses.yml
233
- - test/fixtures/customers.yml
234
- - test/fixtures/developers.yml
235
- - test/fixtures/developers_projects.yml
236
- - test/fixtures/edges.yml
237
- - test/fixtures/entrants.yml
238
- - test/fixtures/faces.yml
239
- - test/fixtures/fk_test_has_fk.yml
240
- - test/fixtures/fk_test_has_pk.yml
241
- - test/fixtures/funny_jokes.yml
242
- - test/fixtures/interests.yml
243
- - test/fixtures/items.yml
244
- - test/fixtures/jobs.yml
245
- - test/fixtures/legacy_things.yml
246
- - test/fixtures/mateys.yml
247
- - test/fixtures/member_types.yml
248
- - test/fixtures/members.yml
249
- - test/fixtures/memberships.yml
250
- - test/fixtures/men.yml
251
- - test/fixtures/minimalistics.yml
252
- - test/fixtures/mixed_case_monkeys.yml
253
- - test/fixtures/mixins.yml
254
- - test/fixtures/movies.yml
255
- - test/fixtures/naked/csv/accounts.csv
256
- - test/fixtures/naked/yml/accounts.yml
257
- - test/fixtures/naked/yml/companies.yml
258
- - test/fixtures/naked/yml/courses.yml
259
- - test/fixtures/organizations.yml
260
- - test/fixtures/owners.yml
261
- - test/fixtures/parrots.yml
262
- - test/fixtures/parrots_pirates.yml
263
- - test/fixtures/people.yml
264
- - test/fixtures/pets.yml
265
- - test/fixtures/pirates.yml
266
- - test/fixtures/polymorphic_designs.yml
267
- - test/fixtures/polymorphic_prices.yml
268
- - test/fixtures/posts.yml
269
- - test/fixtures/price_estimates.yml
270
- - test/fixtures/projects.yml
271
- - test/fixtures/readers.yml
272
- - test/fixtures/references.yml
273
- - test/fixtures/reserved_words/distinct.yml
274
- - test/fixtures/reserved_words/distincts_selects.yml
275
- - test/fixtures/reserved_words/group.yml
276
- - test/fixtures/reserved_words/select.yml
277
- - test/fixtures/reserved_words/values.yml
278
- - test/fixtures/ships.yml
279
- - test/fixtures/sponsors.yml
280
- - test/fixtures/subscribers.yml
281
- - test/fixtures/subscriptions.yml
282
- - test/fixtures/taggings.yml
283
- - test/fixtures/tags.yml
284
- - test/fixtures/tasks.yml
285
- - test/fixtures/tees.yml
286
- - test/fixtures/ties.yml
287
- - test/fixtures/topics.yml
288
- - test/fixtures/toys.yml
289
- - test/fixtures/treasures.yml
290
- - test/fixtures/vertices.yml
291
- - test/fixtures/warehouse-things.yml
292
- - test/fixtures/zines.yml
293
- - test/migrations/broken/100_migration_that_raises_exception.rb
294
- - test/migrations/decimal/1_give_me_big_numbers.rb
295
- - test/migrations/duplicate/1_people_have_last_names.rb
296
- - test/migrations/duplicate/2_we_need_reminders.rb
297
- - test/migrations/duplicate/3_foo.rb
298
- - test/migrations/duplicate/3_innocent_jointable.rb
299
- - test/migrations/duplicate_names/20080507052938_chunky.rb
300
- - test/migrations/duplicate_names/20080507053028_chunky.rb
301
- - test/migrations/interleaved/pass_1/3_innocent_jointable.rb
302
- - test/migrations/interleaved/pass_2/1_people_have_last_names.rb
303
- - test/migrations/interleaved/pass_2/3_innocent_jointable.rb
304
- - test/migrations/interleaved/pass_3/1_people_have_last_names.rb
305
- - test/migrations/interleaved/pass_3/2_i_raise_on_down.rb
306
- - test/migrations/interleaved/pass_3/3_innocent_jointable.rb
307
- - test/migrations/missing/1000_people_have_middle_names.rb
308
- - test/migrations/missing/1_people_have_last_names.rb
309
- - test/migrations/missing/3_we_need_reminders.rb
310
- - test/migrations/missing/4_innocent_jointable.rb
311
- - test/migrations/valid/1_people_have_last_names.rb
312
- - test/migrations/valid/2_we_need_reminders.rb
313
- - test/migrations/valid/3_innocent_jointable.rb
314
- - test/models/author.rb
315
- - test/models/auto_id.rb
316
- - test/models/binary.rb
317
- - test/models/bird.rb
318
- - test/models/book.rb
319
- - test/models/categorization.rb
320
- - test/models/category.rb
321
- - test/models/citation.rb
322
- - test/models/club.rb
323
- - test/models/column_name.rb
324
- - test/models/comment.rb
325
- - test/models/company.rb
326
- - test/models/company_in_module.rb
327
- - test/models/computer.rb
328
- - test/models/contact.rb
329
- - test/models/contract.rb
330
- - test/models/course.rb
331
- - test/models/customer.rb
332
- - test/models/default.rb
333
- - test/models/developer.rb
334
- - test/models/edge.rb
335
- - test/models/entrant.rb
336
- - test/models/essay.rb
337
- - test/models/event.rb
338
- - test/models/event_author.rb
339
- - test/models/face.rb
340
- - test/models/guid.rb
341
- - test/models/interest.rb
342
- - test/models/invoice.rb
343
- - test/models/item.rb
344
- - test/models/job.rb
345
- - test/models/joke.rb
346
- - test/models/keyboard.rb
347
- - test/models/legacy_thing.rb
348
- - test/models/line_item.rb
349
- - test/models/man.rb
350
- - test/models/matey.rb
351
- - test/models/member.rb
352
- - test/models/member_detail.rb
353
- - test/models/member_type.rb
354
- - test/models/membership.rb
355
- - test/models/minimalistic.rb
356
- - test/models/mixed_case_monkey.rb
357
- - test/models/movie.rb
358
- - test/models/order.rb
359
- - test/models/organization.rb
360
- - test/models/owner.rb
361
- - test/models/parrot.rb
362
- - test/models/person.rb
363
- - test/models/pet.rb
364
- - test/models/pirate.rb
365
- - test/models/polymorphic_design.rb
366
- - test/models/polymorphic_price.rb
367
- - test/models/post.rb
368
- - test/models/price_estimate.rb
369
- - test/models/project.rb
370
- - test/models/reader.rb
371
- - test/models/reference.rb
372
- - test/models/reply.rb
373
- - test/models/ship.rb
374
- - test/models/ship_part.rb
375
- - test/models/sponsor.rb
376
- - test/models/subject.rb
377
- - test/models/subscriber.rb
378
- - test/models/subscription.rb
379
- - test/models/tag.rb
380
- - test/models/tagging.rb
381
- - test/models/task.rb
382
- - test/models/tee.rb
383
- - test/models/tie.rb
384
- - test/models/topic.rb
385
- - test/models/toy.rb
386
- - test/models/treasure.rb
387
- - test/models/vertex.rb
388
- - test/models/warehouse_thing.rb
389
- - test/models/zine.rb
390
- - test/schema/mysql_specific_schema.rb
391
- - test/schema/postgresql_specific_schema.rb
392
- - test/schema/schema.rb
393
- - test/schema/schema2.rb
394
- - test/schema/sqlite_specific_schema.rb
395
- - examples/associations.png
396
- - examples/performance.rb
131
+ - lib/generators/active_record/migration/migration_generator.rb
132
+ - lib/generators/active_record/migration/templates/migration.rb
133
+ - lib/generators/active_record/model/model_generator.rb
134
+ - lib/generators/active_record/model/templates/migration.rb
135
+ - lib/generators/active_record/model/templates/model.rb
136
+ - lib/generators/active_record/observer/observer_generator.rb
137
+ - lib/generators/active_record/observer/templates/observer.rb
138
+ - lib/generators/active_record/session_migration/session_migration_generator.rb
139
+ - lib/generators/active_record/session_migration/templates/migration.rb
140
+ - lib/generators/active_record.rb
397
141
  has_rdoc: true
398
142
  homepage: http://www.rubyonrails.org
399
143
  licenses: []
@@ -408,22 +152,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
408
152
  requirements:
409
153
  - - ">="
410
154
  - !ruby/object:Gem::Version
411
- segments:
412
- - 0
413
155
  version: "0"
156
+ version:
414
157
  required_rubygems_version: !ruby/object:Gem::Requirement
415
158
  requirements:
416
- - - ">="
159
+ - - ">"
417
160
  - !ruby/object:Gem::Version
418
- segments:
419
- - 0
420
- version: "0"
161
+ version: 1.3.1
162
+ version:
421
163
  requirements: []
422
164
 
423
165
  rubyforge_project: activerecord
424
- rubygems_version: 1.3.6
166
+ rubygems_version: 1.3.5
425
167
  signing_key:
426
168
  specification_version: 3
427
- summary: Implements the ActiveRecord pattern for ORM.
169
+ summary: Object-relational mapper framework (part of Rails).
428
170
  test_files: []
429
171