activerecord 2.3.18 → 3.2.22

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 (454) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1014 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +222 -0
  5. data/examples/performance.rb +100 -126
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record/aggregations.rb +93 -99
  8. data/lib/active_record/associations/alias_tracker.rb +76 -0
  9. data/lib/active_record/associations/association.rb +247 -0
  10. data/lib/active_record/associations/association_scope.rb +134 -0
  11. data/lib/active_record/associations/belongs_to_association.rb +54 -61
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
  13. data/lib/active_record/associations/builder/association.rb +55 -0
  14. data/lib/active_record/associations/builder/belongs_to.rb +88 -0
  15. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  17. data/lib/active_record/associations/builder/has_many.rb +71 -0
  18. data/lib/active_record/associations/builder/has_one.rb +62 -0
  19. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  20. data/lib/active_record/associations/collection_association.rb +580 -0
  21. data/lib/active_record/associations/collection_proxy.rb +133 -0
  22. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
  23. data/lib/active_record/associations/has_many_association.rb +60 -79
  24. data/lib/active_record/associations/has_many_through_association.rb +127 -206
  25. data/lib/active_record/associations/has_one_association.rb +55 -114
  26. data/lib/active_record/associations/has_one_through_association.rb +25 -26
  27. data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
  28. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  29. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  30. data/lib/active_record/associations/join_dependency.rb +214 -0
  31. data/lib/active_record/associations/join_helper.rb +55 -0
  32. data/lib/active_record/associations/preloader/association.rb +125 -0
  33. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  34. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  35. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  36. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  37. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  38. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  39. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  40. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  41. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  42. data/lib/active_record/associations/preloader.rb +181 -0
  43. data/lib/active_record/associations/singular_association.rb +64 -0
  44. data/lib/active_record/associations/through_association.rb +87 -0
  45. data/lib/active_record/associations.rb +693 -1337
  46. data/lib/active_record/attribute_assignment.rb +221 -0
  47. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  48. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  49. data/lib/active_record/attribute_methods/dirty.rb +111 -0
  50. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  51. data/lib/active_record/attribute_methods/query.rb +39 -0
  52. data/lib/active_record/attribute_methods/read.rb +136 -0
  53. data/lib/active_record/attribute_methods/serialization.rb +120 -0
  54. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
  55. data/lib/active_record/attribute_methods/write.rb +70 -0
  56. data/lib/active_record/attribute_methods.rb +211 -339
  57. data/lib/active_record/autosave_association.rb +179 -149
  58. data/lib/active_record/base.rb +401 -2907
  59. data/lib/active_record/callbacks.rb +91 -176
  60. data/lib/active_record/coders/yaml_column.rb +41 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
  62. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
  68. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
  69. data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
  70. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
  71. data/lib/active_record/connection_adapters/column.rb +296 -0
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
  73. data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
  75. data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
  76. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
  77. data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
  78. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  79. data/lib/active_record/counter_cache.rb +123 -0
  80. data/lib/active_record/dynamic_finder_match.rb +41 -14
  81. data/lib/active_record/dynamic_matchers.rb +84 -0
  82. data/lib/active_record/dynamic_scope_match.rb +13 -15
  83. data/lib/active_record/errors.rb +195 -0
  84. data/lib/active_record/explain.rb +86 -0
  85. data/lib/active_record/explain_subscriber.rb +25 -0
  86. data/lib/active_record/fixtures/file.rb +65 -0
  87. data/lib/active_record/fixtures.rb +695 -770
  88. data/lib/active_record/identity_map.rb +162 -0
  89. data/lib/active_record/inheritance.rb +174 -0
  90. data/lib/active_record/integration.rb +60 -0
  91. data/lib/active_record/locale/en.yml +9 -27
  92. data/lib/active_record/locking/optimistic.rb +76 -73
  93. data/lib/active_record/locking/pessimistic.rb +32 -10
  94. data/lib/active_record/log_subscriber.rb +72 -0
  95. data/lib/active_record/migration/command_recorder.rb +105 -0
  96. data/lib/active_record/migration.rb +415 -205
  97. data/lib/active_record/model_schema.rb +368 -0
  98. data/lib/active_record/nested_attributes.rb +153 -63
  99. data/lib/active_record/observer.rb +27 -103
  100. data/lib/active_record/persistence.rb +376 -0
  101. data/lib/active_record/query_cache.rb +49 -8
  102. data/lib/active_record/querying.rb +58 -0
  103. data/lib/active_record/railtie.rb +131 -0
  104. data/lib/active_record/railties/console_sandbox.rb +6 -0
  105. data/lib/active_record/railties/controller_runtime.rb +49 -0
  106. data/lib/active_record/railties/databases.rake +659 -0
  107. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  108. data/lib/active_record/readonly_attributes.rb +26 -0
  109. data/lib/active_record/reflection.rb +269 -120
  110. data/lib/active_record/relation/batches.rb +90 -0
  111. data/lib/active_record/relation/calculations.rb +372 -0
  112. data/lib/active_record/relation/delegation.rb +49 -0
  113. data/lib/active_record/relation/finder_methods.rb +402 -0
  114. data/lib/active_record/relation/predicate_builder.rb +63 -0
  115. data/lib/active_record/relation/query_methods.rb +417 -0
  116. data/lib/active_record/relation/spawn_methods.rb +180 -0
  117. data/lib/active_record/relation.rb +537 -0
  118. data/lib/active_record/result.rb +40 -0
  119. data/lib/active_record/sanitization.rb +194 -0
  120. data/lib/active_record/schema.rb +9 -6
  121. data/lib/active_record/schema_dumper.rb +55 -32
  122. data/lib/active_record/scoping/default.rb +142 -0
  123. data/lib/active_record/scoping/named.rb +200 -0
  124. data/lib/active_record/scoping.rb +152 -0
  125. data/lib/active_record/serialization.rb +8 -91
  126. data/lib/active_record/serializers/xml_serializer.rb +43 -197
  127. data/lib/active_record/session_store.rb +129 -103
  128. data/lib/active_record/store.rb +52 -0
  129. data/lib/active_record/test_case.rb +30 -23
  130. data/lib/active_record/timestamp.rb +95 -52
  131. data/lib/active_record/transactions.rb +212 -66
  132. data/lib/active_record/translation.rb +22 -0
  133. data/lib/active_record/validations/associated.rb +43 -0
  134. data/lib/active_record/validations/uniqueness.rb +180 -0
  135. data/lib/active_record/validations.rb +43 -1106
  136. data/lib/active_record/version.rb +5 -4
  137. data/lib/active_record.rb +121 -48
  138. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  139. data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
  140. data/lib/rails/generators/active_record/migration.rb +15 -0
  141. data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
  142. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  143. data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
  144. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  145. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  146. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  147. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  148. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  149. data/lib/rails/generators/active_record.rb +25 -0
  150. metadata +187 -363
  151. data/CHANGELOG +0 -5904
  152. data/README +0 -351
  153. data/RUNNING_UNIT_TESTS +0 -36
  154. data/Rakefile +0 -268
  155. data/install.rb +0 -30
  156. data/lib/active_record/association_preload.rb +0 -406
  157. data/lib/active_record/associations/association_collection.rb +0 -533
  158. data/lib/active_record/associations/association_proxy.rb +0 -288
  159. data/lib/active_record/batches.rb +0 -85
  160. data/lib/active_record/calculations.rb +0 -321
  161. data/lib/active_record/dirty.rb +0 -183
  162. data/lib/active_record/named_scope.rb +0 -197
  163. data/lib/active_record/serializers/json_serializer.rb +0 -91
  164. data/lib/activerecord.rb +0 -2
  165. data/test/assets/example.log +0 -1
  166. data/test/assets/flowers.jpg +0 -0
  167. data/test/cases/aaa_create_tables_test.rb +0 -24
  168. data/test/cases/active_schema_test_mysql.rb +0 -122
  169. data/test/cases/active_schema_test_postgresql.rb +0 -24
  170. data/test/cases/adapter_test.rb +0 -144
  171. data/test/cases/aggregations_test.rb +0 -167
  172. data/test/cases/ar_schema_test.rb +0 -32
  173. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  174. data/test/cases/associations/callbacks_test.rb +0 -161
  175. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  176. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  177. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  178. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  179. data/test/cases/associations/eager_singularization_test.rb +0 -145
  180. data/test/cases/associations/eager_test.rb +0 -852
  181. data/test/cases/associations/extension_test.rb +0 -62
  182. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  183. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  184. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  185. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  186. data/test/cases/associations/has_one_associations_test.rb +0 -330
  187. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  188. data/test/cases/associations/inner_join_association_test.rb +0 -93
  189. data/test/cases/associations/inverse_associations_test.rb +0 -566
  190. data/test/cases/associations/join_model_test.rb +0 -712
  191. data/test/cases/associations_test.rb +0 -282
  192. data/test/cases/attribute_methods_test.rb +0 -305
  193. data/test/cases/autosave_association_test.rb +0 -1218
  194. data/test/cases/base_test.rb +0 -2166
  195. data/test/cases/batches_test.rb +0 -81
  196. data/test/cases/binary_test.rb +0 -30
  197. data/test/cases/calculations_test.rb +0 -360
  198. data/test/cases/callbacks_observers_test.rb +0 -38
  199. data/test/cases/callbacks_test.rb +0 -438
  200. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  201. data/test/cases/column_alias_test.rb +0 -17
  202. data/test/cases/column_definition_test.rb +0 -70
  203. data/test/cases/connection_pool_test.rb +0 -25
  204. data/test/cases/connection_test_firebird.rb +0 -8
  205. data/test/cases/connection_test_mysql.rb +0 -65
  206. data/test/cases/copy_table_test_sqlite.rb +0 -80
  207. data/test/cases/counter_cache_test.rb +0 -84
  208. data/test/cases/database_statements_test.rb +0 -12
  209. data/test/cases/datatype_test_postgresql.rb +0 -204
  210. data/test/cases/date_time_test.rb +0 -37
  211. data/test/cases/default_test_firebird.rb +0 -16
  212. data/test/cases/defaults_test.rb +0 -111
  213. data/test/cases/deprecated_finder_test.rb +0 -30
  214. data/test/cases/dirty_test.rb +0 -316
  215. data/test/cases/finder_respond_to_test.rb +0 -76
  216. data/test/cases/finder_test.rb +0 -1098
  217. data/test/cases/fixtures_test.rb +0 -661
  218. data/test/cases/helper.rb +0 -68
  219. data/test/cases/i18n_test.rb +0 -46
  220. data/test/cases/inheritance_test.rb +0 -262
  221. data/test/cases/invalid_date_test.rb +0 -24
  222. data/test/cases/json_serialization_test.rb +0 -219
  223. data/test/cases/lifecycle_test.rb +0 -193
  224. data/test/cases/locking_test.rb +0 -350
  225. data/test/cases/method_scoping_test.rb +0 -704
  226. data/test/cases/migration_test.rb +0 -1649
  227. data/test/cases/migration_test_firebird.rb +0 -124
  228. data/test/cases/mixin_test.rb +0 -96
  229. data/test/cases/modules_test.rb +0 -109
  230. data/test/cases/multiple_db_test.rb +0 -85
  231. data/test/cases/named_scope_test.rb +0 -372
  232. data/test/cases/nested_attributes_test.rb +0 -840
  233. data/test/cases/pk_test.rb +0 -119
  234. data/test/cases/pooled_connections_test.rb +0 -103
  235. data/test/cases/query_cache_test.rb +0 -129
  236. data/test/cases/readonly_test.rb +0 -107
  237. data/test/cases/reflection_test.rb +0 -234
  238. data/test/cases/reload_models_test.rb +0 -22
  239. data/test/cases/repair_helper.rb +0 -50
  240. data/test/cases/reserved_word_test_mysql.rb +0 -176
  241. data/test/cases/sanitize_test.rb +0 -25
  242. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  243. data/test/cases/schema_dumper_test.rb +0 -211
  244. data/test/cases/schema_test_postgresql.rb +0 -178
  245. data/test/cases/serialization_test.rb +0 -47
  246. data/test/cases/sp_test_mysql.rb +0 -16
  247. data/test/cases/synonym_test_oracle.rb +0 -17
  248. data/test/cases/timestamp_test.rb +0 -75
  249. data/test/cases/transactions_test.rb +0 -543
  250. data/test/cases/unconnected_test.rb +0 -32
  251. data/test/cases/validations_i18n_test.rb +0 -925
  252. data/test/cases/validations_test.rb +0 -1684
  253. data/test/cases/xml_serialization_test.rb +0 -240
  254. data/test/cases/yaml_serialization_test.rb +0 -11
  255. data/test/config.rb +0 -5
  256. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  257. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  258. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  259. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  260. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  261. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  262. data/test/connections/native_db2/connection.rb +0 -25
  263. data/test/connections/native_firebird/connection.rb +0 -26
  264. data/test/connections/native_frontbase/connection.rb +0 -27
  265. data/test/connections/native_mysql/connection.rb +0 -25
  266. data/test/connections/native_openbase/connection.rb +0 -21
  267. data/test/connections/native_oracle/connection.rb +0 -27
  268. data/test/connections/native_postgresql/connection.rb +0 -21
  269. data/test/connections/native_sqlite/connection.rb +0 -25
  270. data/test/connections/native_sqlite3/connection.rb +0 -25
  271. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  272. data/test/connections/native_sybase/connection.rb +0 -23
  273. data/test/fixtures/accounts.yml +0 -29
  274. data/test/fixtures/all/developers.yml +0 -0
  275. data/test/fixtures/all/people.csv +0 -0
  276. data/test/fixtures/all/tasks.yml +0 -0
  277. data/test/fixtures/author_addresses.yml +0 -5
  278. data/test/fixtures/author_favorites.yml +0 -4
  279. data/test/fixtures/authors.yml +0 -9
  280. data/test/fixtures/binaries.yml +0 -132
  281. data/test/fixtures/books.yml +0 -7
  282. data/test/fixtures/categories/special_categories.yml +0 -9
  283. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  284. data/test/fixtures/categories.yml +0 -14
  285. data/test/fixtures/categories_ordered.yml +0 -7
  286. data/test/fixtures/categories_posts.yml +0 -23
  287. data/test/fixtures/categorizations.yml +0 -17
  288. data/test/fixtures/clubs.yml +0 -6
  289. data/test/fixtures/comments.yml +0 -59
  290. data/test/fixtures/companies.yml +0 -56
  291. data/test/fixtures/computers.yml +0 -4
  292. data/test/fixtures/courses.yml +0 -7
  293. data/test/fixtures/customers.yml +0 -26
  294. data/test/fixtures/developers.yml +0 -21
  295. data/test/fixtures/developers_projects.yml +0 -17
  296. data/test/fixtures/edges.yml +0 -6
  297. data/test/fixtures/entrants.yml +0 -14
  298. data/test/fixtures/faces.yml +0 -11
  299. data/test/fixtures/fk_test_has_fk.yml +0 -3
  300. data/test/fixtures/fk_test_has_pk.yml +0 -2
  301. data/test/fixtures/funny_jokes.yml +0 -10
  302. data/test/fixtures/interests.yml +0 -33
  303. data/test/fixtures/items.yml +0 -4
  304. data/test/fixtures/jobs.yml +0 -7
  305. data/test/fixtures/legacy_things.yml +0 -3
  306. data/test/fixtures/mateys.yml +0 -4
  307. data/test/fixtures/member_types.yml +0 -6
  308. data/test/fixtures/members.yml +0 -6
  309. data/test/fixtures/memberships.yml +0 -20
  310. data/test/fixtures/men.yml +0 -5
  311. data/test/fixtures/minimalistics.yml +0 -2
  312. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  313. data/test/fixtures/mixins.yml +0 -29
  314. data/test/fixtures/movies.yml +0 -7
  315. data/test/fixtures/naked/csv/accounts.csv +0 -1
  316. data/test/fixtures/naked/yml/accounts.yml +0 -1
  317. data/test/fixtures/naked/yml/companies.yml +0 -1
  318. data/test/fixtures/naked/yml/courses.yml +0 -1
  319. data/test/fixtures/organizations.yml +0 -5
  320. data/test/fixtures/owners.yml +0 -7
  321. data/test/fixtures/parrots.yml +0 -27
  322. data/test/fixtures/parrots_pirates.yml +0 -7
  323. data/test/fixtures/people.yml +0 -15
  324. data/test/fixtures/pets.yml +0 -14
  325. data/test/fixtures/pirates.yml +0 -9
  326. data/test/fixtures/polymorphic_designs.yml +0 -19
  327. data/test/fixtures/polymorphic_prices.yml +0 -19
  328. data/test/fixtures/posts.yml +0 -52
  329. data/test/fixtures/price_estimates.yml +0 -7
  330. data/test/fixtures/projects.yml +0 -7
  331. data/test/fixtures/readers.yml +0 -9
  332. data/test/fixtures/references.yml +0 -17
  333. data/test/fixtures/reserved_words/distinct.yml +0 -5
  334. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  335. data/test/fixtures/reserved_words/group.yml +0 -14
  336. data/test/fixtures/reserved_words/select.yml +0 -8
  337. data/test/fixtures/reserved_words/values.yml +0 -7
  338. data/test/fixtures/ships.yml +0 -5
  339. data/test/fixtures/sponsors.yml +0 -9
  340. data/test/fixtures/subscribers.yml +0 -7
  341. data/test/fixtures/subscriptions.yml +0 -12
  342. data/test/fixtures/taggings.yml +0 -28
  343. data/test/fixtures/tags.yml +0 -7
  344. data/test/fixtures/tasks.yml +0 -7
  345. data/test/fixtures/tees.yml +0 -4
  346. data/test/fixtures/ties.yml +0 -4
  347. data/test/fixtures/topics.yml +0 -42
  348. data/test/fixtures/toys.yml +0 -4
  349. data/test/fixtures/treasures.yml +0 -10
  350. data/test/fixtures/vertices.yml +0 -4
  351. data/test/fixtures/warehouse-things.yml +0 -3
  352. data/test/fixtures/zines.yml +0 -5
  353. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  354. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  355. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  356. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  357. data/test/migrations/duplicate/3_foo.rb +0 -7
  358. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  359. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  360. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  361. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  362. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  363. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  364. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  365. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  366. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  367. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  368. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  369. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  370. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  371. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  372. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  373. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  374. data/test/models/author.rb +0 -151
  375. data/test/models/auto_id.rb +0 -4
  376. data/test/models/binary.rb +0 -2
  377. data/test/models/bird.rb +0 -9
  378. data/test/models/book.rb +0 -4
  379. data/test/models/categorization.rb +0 -5
  380. data/test/models/category.rb +0 -34
  381. data/test/models/citation.rb +0 -6
  382. data/test/models/club.rb +0 -13
  383. data/test/models/column_name.rb +0 -3
  384. data/test/models/comment.rb +0 -29
  385. data/test/models/company.rb +0 -173
  386. data/test/models/company_in_module.rb +0 -78
  387. data/test/models/computer.rb +0 -3
  388. data/test/models/contact.rb +0 -16
  389. data/test/models/contract.rb +0 -5
  390. data/test/models/course.rb +0 -3
  391. data/test/models/customer.rb +0 -73
  392. data/test/models/default.rb +0 -2
  393. data/test/models/developer.rb +0 -101
  394. data/test/models/edge.rb +0 -5
  395. data/test/models/entrant.rb +0 -3
  396. data/test/models/essay.rb +0 -3
  397. data/test/models/event.rb +0 -3
  398. data/test/models/event_author.rb +0 -8
  399. data/test/models/face.rb +0 -7
  400. data/test/models/guid.rb +0 -2
  401. data/test/models/interest.rb +0 -5
  402. data/test/models/invoice.rb +0 -4
  403. data/test/models/item.rb +0 -7
  404. data/test/models/job.rb +0 -5
  405. data/test/models/joke.rb +0 -3
  406. data/test/models/keyboard.rb +0 -3
  407. data/test/models/legacy_thing.rb +0 -3
  408. data/test/models/line_item.rb +0 -3
  409. data/test/models/man.rb +0 -9
  410. data/test/models/matey.rb +0 -4
  411. data/test/models/member.rb +0 -12
  412. data/test/models/member_detail.rb +0 -5
  413. data/test/models/member_type.rb +0 -3
  414. data/test/models/membership.rb +0 -9
  415. data/test/models/minimalistic.rb +0 -2
  416. data/test/models/mixed_case_monkey.rb +0 -3
  417. data/test/models/movie.rb +0 -5
  418. data/test/models/order.rb +0 -4
  419. data/test/models/organization.rb +0 -6
  420. data/test/models/owner.rb +0 -5
  421. data/test/models/parrot.rb +0 -22
  422. data/test/models/person.rb +0 -16
  423. data/test/models/pet.rb +0 -5
  424. data/test/models/pirate.rb +0 -80
  425. data/test/models/polymorphic_design.rb +0 -3
  426. data/test/models/polymorphic_price.rb +0 -3
  427. data/test/models/post.rb +0 -102
  428. data/test/models/price_estimate.rb +0 -3
  429. data/test/models/project.rb +0 -30
  430. data/test/models/reader.rb +0 -4
  431. data/test/models/reference.rb +0 -4
  432. data/test/models/reply.rb +0 -46
  433. data/test/models/ship.rb +0 -19
  434. data/test/models/ship_part.rb +0 -7
  435. data/test/models/sponsor.rb +0 -4
  436. data/test/models/subject.rb +0 -4
  437. data/test/models/subscriber.rb +0 -8
  438. data/test/models/subscription.rb +0 -4
  439. data/test/models/tag.rb +0 -7
  440. data/test/models/tagging.rb +0 -10
  441. data/test/models/task.rb +0 -3
  442. data/test/models/tee.rb +0 -4
  443. data/test/models/tie.rb +0 -4
  444. data/test/models/topic.rb +0 -80
  445. data/test/models/toy.rb +0 -6
  446. data/test/models/treasure.rb +0 -8
  447. data/test/models/vertex.rb +0 -9
  448. data/test/models/warehouse_thing.rb +0 -5
  449. data/test/models/zine.rb +0 -3
  450. data/test/schema/mysql_specific_schema.rb +0 -31
  451. data/test/schema/postgresql_specific_schema.rb +0 -114
  452. data/test/schema/schema.rb +0 -550
  453. data/test/schema/schema2.rb +0 -6
  454. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,3 +1,4 @@
1
+ require 'active_support/core_ext/object/blank'
1
2
  require 'date'
2
3
  require 'set'
3
4
  require 'bigdecimal'
@@ -5,258 +6,7 @@ require 'bigdecimal/util'
5
6
 
6
7
  module ActiveRecord
7
8
  module ConnectionAdapters #:nodoc:
8
- # An abstract definition of a column in a table.
9
- class Column
10
- TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
11
- FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
12
-
13
- module Format
14
- ISO_DATE = /\A(\d{4})-(\d\d)-(\d\d)\z/
15
- ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(\.\d+)?\z/
16
- end
17
-
18
- attr_reader :name, :default, :type, :limit, :null, :sql_type, :precision, :scale
19
- attr_accessor :primary
20
-
21
- # Instantiates a new column in the table.
22
- #
23
- # +name+ is the column's name, such as <tt>supplier_id</tt> in <tt>supplier_id int(11)</tt>.
24
- # +default+ is the type-casted default value, such as +new+ in <tt>sales_stage varchar(20) default 'new'</tt>.
25
- # +sql_type+ is only used to extract the column's length, if necessary. For example +60+ in <tt>company_name varchar(60)</tt>.
26
- # +null+ determines if this column allows +NULL+ values.
27
- def initialize(name, default, sql_type = nil, null = true)
28
- @name, @sql_type, @null = name, sql_type, null
29
- @limit, @precision, @scale = extract_limit(sql_type), extract_precision(sql_type), extract_scale(sql_type)
30
- @type = simplified_type(sql_type)
31
- @default = extract_default(default)
32
-
33
- @primary = nil
34
- end
35
-
36
- # Returns +true+ if the column is either of type string or text.
37
- def text?
38
- type == :string || type == :text
39
- end
40
-
41
- # Returns +true+ if the column is either of type integer, float or decimal.
42
- def number?
43
- type == :integer || type == :float || type == :decimal
44
- end
45
-
46
- def has_default?
47
- !default.nil?
48
- end
49
-
50
- # Returns the Ruby class that corresponds to the abstract data type.
51
- def klass
52
- case type
53
- when :integer then Fixnum
54
- when :float then Float
55
- when :decimal then BigDecimal
56
- when :datetime then Time
57
- when :date then Date
58
- when :timestamp then Time
59
- when :time then Time
60
- when :text, :string then String
61
- when :binary then String
62
- when :boolean then Object
63
- end
64
- end
65
-
66
- # Casts value (which is a String) to an appropriate instance.
67
- def type_cast(value)
68
- return nil if value.nil?
69
- case type
70
- when :string then value
71
- when :text then value
72
- when :integer then value.to_i rescue value ? 1 : 0
73
- when :float then value.to_f
74
- when :decimal then self.class.value_to_decimal(value)
75
- when :datetime then self.class.string_to_time(value)
76
- when :timestamp then self.class.string_to_time(value)
77
- when :time then self.class.string_to_dummy_time(value)
78
- when :date then self.class.string_to_date(value)
79
- when :binary then self.class.binary_to_string(value)
80
- when :boolean then self.class.value_to_boolean(value)
81
- else value
82
- end
83
- end
84
-
85
- def type_cast_code(var_name)
86
- case type
87
- when :string then nil
88
- when :text then nil
89
- when :integer then "(#{var_name}.to_i rescue #{var_name} ? 1 : 0)"
90
- when :float then "#{var_name}.to_f"
91
- when :decimal then "#{self.class.name}.value_to_decimal(#{var_name})"
92
- when :datetime then "#{self.class.name}.string_to_time(#{var_name})"
93
- when :timestamp then "#{self.class.name}.string_to_time(#{var_name})"
94
- when :time then "#{self.class.name}.string_to_dummy_time(#{var_name})"
95
- when :date then "#{self.class.name}.string_to_date(#{var_name})"
96
- when :binary then "#{self.class.name}.binary_to_string(#{var_name})"
97
- when :boolean then "#{self.class.name}.value_to_boolean(#{var_name})"
98
- else nil
99
- end
100
- end
101
-
102
- # Returns the human name of the column name.
103
- #
104
- # ===== Examples
105
- # Column.new('sales_stage', ...).human_name # => 'Sales stage'
106
- def human_name
107
- Base.human_attribute_name(@name)
108
- end
109
-
110
- def extract_default(default)
111
- type_cast(default)
112
- end
113
-
114
- class << self
115
- # Used to convert from Strings to BLOBs
116
- def string_to_binary(value)
117
- value
118
- end
119
-
120
- # Used to convert from BLOBs to Strings
121
- def binary_to_string(value)
122
- value
123
- end
124
-
125
- def string_to_date(string)
126
- return string unless string.is_a?(String)
127
- return nil if string.empty?
128
-
129
- fast_string_to_date(string) || fallback_string_to_date(string)
130
- end
131
-
132
- def string_to_time(string)
133
- return string unless string.is_a?(String)
134
- return nil if string.empty?
135
-
136
- fast_string_to_time(string) || fallback_string_to_time(string)
137
- end
138
-
139
- def string_to_dummy_time(string)
140
- return string unless string.is_a?(String)
141
- return nil if string.empty?
142
-
143
- string_to_time "2000-01-01 #{string}"
144
- end
145
-
146
- # convert something to a boolean
147
- def value_to_boolean(value)
148
- if value.is_a?(String) && value.blank?
149
- nil
150
- else
151
- TRUE_VALUES.include?(value)
152
- end
153
- end
154
-
155
- # convert something to a BigDecimal
156
- def value_to_decimal(value)
157
- # Using .class is faster than .is_a? and
158
- # subclasses of BigDecimal will be handled
159
- # in the else clause
160
- if value.class == BigDecimal
161
- value
162
- elsif value.respond_to?(:to_d)
163
- value.to_d
164
- else
165
- value.to_s.to_d
166
- end
167
- end
168
-
169
- protected
170
- # '0.123456' -> 123456
171
- # '1.123456' -> 123456
172
- def microseconds(time)
173
- ((time[:sec_fraction].to_f % 1) * 1_000_000).to_i
174
- end
175
-
176
- def new_date(year, mon, mday)
177
- if year && year != 0
178
- Date.new(year, mon, mday) rescue nil
179
- end
180
- end
181
-
182
- def new_time(year, mon, mday, hour, min, sec, microsec)
183
- # Treat 0000-00-00 00:00:00 as nil.
184
- return nil if year.nil? || year == 0
185
-
186
- Time.time_with_datetime_fallback(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
187
- end
188
-
189
- def fast_string_to_date(string)
190
- if string =~ Format::ISO_DATE
191
- new_date $1.to_i, $2.to_i, $3.to_i
192
- end
193
- end
194
-
195
- # Doesn't handle time zones.
196
- def fast_string_to_time(string)
197
- if string =~ Format::ISO_DATETIME
198
- microsec = ($7.to_f * 1_000_000).to_i
199
- new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
200
- end
201
- end
202
-
203
- def fallback_string_to_date(string)
204
- new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
205
- end
206
-
207
- def fallback_string_to_time(string)
208
- time_hash = Date._parse(string)
209
- time_hash[:sec_fraction] = microseconds(time_hash)
210
-
211
- new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
212
- end
213
- end
214
-
215
- private
216
- def extract_limit(sql_type)
217
- $1.to_i if sql_type =~ /\((.*)\)/
218
- end
219
-
220
- def extract_precision(sql_type)
221
- $2.to_i if sql_type =~ /^(numeric|decimal|number)\((\d+)(,\d+)?\)/i
222
- end
223
-
224
- def extract_scale(sql_type)
225
- case sql_type
226
- when /^(numeric|decimal|number)\((\d+)\)/i then 0
227
- when /^(numeric|decimal|number)\((\d+)(,(\d+))\)/i then $4.to_i
228
- end
229
- end
230
-
231
- def simplified_type(field_type)
232
- case field_type
233
- when /int/i
234
- :integer
235
- when /float|double/i
236
- :float
237
- when /decimal|numeric|number/i
238
- extract_scale(field_type) == 0 ? :integer : :decimal
239
- when /datetime/i
240
- :datetime
241
- when /timestamp/i
242
- :timestamp
243
- when /time/i
244
- :time
245
- when /date/i
246
- :date
247
- when /clob/i, /text/i
248
- :text
249
- when /blob/i, /binary/i
250
- :binary
251
- when /char/i, /string/i
252
- :string
253
- when /boolean/i
254
- :boolean
255
- end
256
- end
257
- end
258
-
259
- class IndexDefinition < Struct.new(:table, :name, :unique, :columns, :lengths) #:nodoc:
9
+ class IndexDefinition < Struct.new(:table, :name, :unique, :columns, :lengths, :orders) #:nodoc:
260
10
  end
261
11
 
262
12
  # Abstract representation of a column definition. Instances of this type
@@ -265,6 +15,10 @@ module ActiveRecord
265
15
  # for generating a number of table creation or table changing SQL statements.
266
16
  class ColumnDefinition < Struct.new(:base, :name, :type, :limit, :precision, :scale, :default, :null) #:nodoc:
267
17
 
18
+ def string_to_binary(value)
19
+ value
20
+ end
21
+
268
22
  def sql_type
269
23
  base.type_to_sql(type.to_sym, limit, precision, scale) rescue type
270
24
  end
@@ -288,17 +42,17 @@ module ActiveRecord
288
42
  # Represents the schema of an SQL table in an abstract way. This class
289
43
  # provides methods for manipulating the schema representation.
290
44
  #
291
- # Inside migration files, the +t+ object in +create_table+ and
292
- # +change_table+ is actually of this type:
45
+ # Inside migration files, the +t+ object in +create_table+
46
+ # is actually of this type:
293
47
  #
294
48
  # class SomeMigration < ActiveRecord::Migration
295
- # def self.up
49
+ # def up
296
50
  # create_table :foo do |t|
297
51
  # puts t.class # => "ActiveRecord::ConnectionAdapters::TableDefinition"
298
52
  # end
299
53
  # end
300
54
  #
301
- # def self.down
55
+ # def down
302
56
  # ...
303
57
  # end
304
58
  # end
@@ -312,23 +66,19 @@ module ActiveRecord
312
66
 
313
67
  def initialize(base)
314
68
  @columns = []
69
+ @columns_hash = {}
315
70
  @base = base
316
71
  end
317
72
 
318
- #Handles non supported datatypes - e.g. XML
319
- def method_missing(symbol, *args)
320
- if symbol.to_s == 'xml'
321
- xml_column_fallback(args)
322
- end
73
+ def xml(*args)
74
+ raise NotImplementedError unless %w{
75
+ sqlite mysql mysql2
76
+ }.include? @base.adapter_name.downcase
77
+
78
+ options = args.extract_options!
79
+ column(args[0], :text, options)
323
80
  end
324
81
 
325
- def xml_column_fallback(*args)
326
- case @base.adapter_name.downcase
327
- when 'sqlite', 'mysql'
328
- options = args.extract_options!
329
- column(args[0], :text, options)
330
- end
331
- end
332
82
  # Appends a primary key definition to the table definition.
333
83
  # Can be called multiple times, but this is probably not a good idea.
334
84
  def primary_key(name)
@@ -337,7 +87,7 @@ module ActiveRecord
337
87
 
338
88
  # Returns a ColumnDefinition for the column with name +name+.
339
89
  def [](name)
340
- @columns.find {|column| column.name.to_s == name.to_s}
90
+ @columns_hash[name.to_s]
341
91
  end
342
92
 
343
93
  # Instantiates a new column for the table.
@@ -354,7 +104,8 @@ module ActiveRecord
354
104
  #
355
105
  # Available options are (none of these exists by default):
356
106
  # * <tt>:limit</tt> -
357
- # Requests a maximum column length. This is number of characters for <tt>:string</tt> and <tt>:text</tt> columns and number of bytes for :binary and :integer columns.
107
+ # Requests a maximum column length. This is number of characters for <tt>:string</tt> and
108
+ # <tt>:text</tt> columns and number of bytes for <tt>:binary</tt> and <tt>:integer</tt> columns.
358
109
  # * <tt>:default</tt> -
359
110
  # The column's default value. Use nil for NULL.
360
111
  # * <tt>:null</tt> -
@@ -403,7 +154,7 @@ module ActiveRecord
403
154
  # This method returns <tt>self</tt>.
404
155
  #
405
156
  # == Examples
406
- # # Assuming td is an instance of TableDefinition
157
+ # # Assuming +td+ is an instance of TableDefinition
407
158
  # td.column(:granted, :boolean)
408
159
  # # granted BOOLEAN
409
160
  #
@@ -454,11 +205,11 @@ module ActiveRecord
454
205
  # end
455
206
  #
456
207
  # There's a short-hand method for each of the type values declared at the top. And then there's
457
- # TableDefinition#timestamps that'll add created_at and +updated_at+ as datetimes.
208
+ # TableDefinition#timestamps that'll add +created_at+ and +updated_at+ as datetimes.
458
209
  #
459
210
  # TableDefinition#references will add an appropriately-named _id column, plus a corresponding _type
460
- # column if the <tt>:polymorphic</tt> option is supplied. If <tt>:polymorphic</tt> is a hash of options, these will be
461
- # used when creating the <tt>_type</tt> column. So what can be written like this:
211
+ # column if the <tt>:polymorphic</tt> option is supplied. If <tt>:polymorphic</tt> is a hash of
212
+ # options, these will be used when creating the <tt>_type</tt> column. So what can be written like this:
462
213
  #
463
214
  # create_table :taggings do |t|
464
215
  # t.integer :tag_id, :tagger_id, :taggable_id
@@ -474,35 +225,38 @@ module ActiveRecord
474
225
  # t.references :taggable, :polymorphic => { :default => 'Photo' }
475
226
  # end
476
227
  def column(name, type, options = {})
477
- column = self[name] || ColumnDefinition.new(@base, name, type)
478
- if options[:limit]
479
- column.limit = options[:limit]
480
- elsif native[type.to_sym].is_a?(Hash)
481
- column.limit = native[type.to_sym][:limit]
228
+ name = name.to_s
229
+ type = type.to_sym
230
+
231
+ column = self[name] || new_column_definition(@base, name, type)
232
+
233
+ limit = options.fetch(:limit) do
234
+ native[type][:limit] if native[type].is_a?(Hash)
482
235
  end
236
+
237
+ column.limit = limit
483
238
  column.precision = options[:precision]
484
- column.scale = options[:scale]
485
- column.default = options[:default]
486
- column.null = options[:null]
487
- @columns << column unless @columns.include? column
239
+ column.scale = options[:scale]
240
+ column.default = options[:default]
241
+ column.null = options[:null]
488
242
  self
489
243
  end
490
244
 
491
245
  %w( string text integer float decimal datetime timestamp time date binary boolean ).each do |column_type|
492
- class_eval <<-EOV
493
- def #{column_type}(*args) # def string(*args)
494
- options = args.extract_options! # options = args.extract_options!
495
- column_names = args # column_names = args
496
- #
497
- column_names.each { |name| column(name, '#{column_type}', options) } # column_names.each { |name| column(name, 'string', options) }
498
- end # end
246
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
247
+ def #{column_type}(*args) # def string(*args)
248
+ options = args.extract_options! # options = args.extract_options!
249
+ column_names = args # column_names = args
250
+ type = :'#{column_type}' # type = :string
251
+ column_names.each { |name| column(name, type, options) } # column_names.each { |name| column(name, type, options) }
252
+ end # end
499
253
  EOV
500
254
  end
501
255
 
502
256
  # Appends <tt>:datetime</tt> columns <tt>:created_at</tt> and
503
257
  # <tt>:updated_at</tt> to the table.
504
258
  def timestamps(*args)
505
- options = args.extract_options!
259
+ options = { :null => false }.merge(args.extract_options!)
506
260
  column(:created_at, :datetime, options)
507
261
  column(:updated_at, :datetime, options)
508
262
  end
@@ -521,16 +275,23 @@ module ActiveRecord
521
275
  # concatenated together. This string can then be prepended and appended to
522
276
  # to generate the final SQL to create the table.
523
277
  def to_sql
524
- @columns.map(&:to_sql) * ', '
278
+ @columns.map { |c| c.to_sql } * ', '
525
279
  end
526
280
 
527
281
  private
528
- def native
529
- @base.native_database_types
530
- end
282
+ def new_column_definition(base, name, type)
283
+ definition = ColumnDefinition.new base, name, type
284
+ @columns << definition
285
+ @columns_hash[name] = definition
286
+ definition
287
+ end
288
+
289
+ def native
290
+ @base.native_database_types
291
+ end
531
292
  end
532
293
 
533
- # Represents a SQL table in an abstract way for updating a table.
294
+ # Represents an SQL table in an abstract way for updating a table.
534
295
  # Also see TableDefinition and SchemaStatements#create_table
535
296
  #
536
297
  # Available transformations are:
@@ -577,6 +338,11 @@ module ActiveRecord
577
338
  @base.add_column(@table_name, column_name, type, options)
578
339
  end
579
340
 
341
+ # Checks to see if a column exists. See SchemaStatements#column_exists?
342
+ def column_exists?(column_name, type = nil, options = {})
343
+ @base.column_exists?(@table_name, column_name, type, options)
344
+ end
345
+
580
346
  # Adds a new index to the table. +column_name+ can be a single Symbol, or
581
347
  # an Array of Symbols. See SchemaStatements#add_index
582
348
  #
@@ -591,7 +357,12 @@ module ActiveRecord
591
357
  @base.add_index(@table_name, column_name, options)
592
358
  end
593
359
 
594
- # Adds timestamps (created_at and updated_at) columns to the table. See SchemaStatements#add_timestamps
360
+ # Checks to see if an index exists. See SchemaStatements#index_exists?
361
+ def index_exists?(column_name, options = {})
362
+ @base.index_exists?(@table_name, column_name, options)
363
+ end
364
+
365
+ # Adds timestamps (+created_at+ and +updated_at+) columns to the table. See SchemaStatements#add_timestamps
595
366
  # ===== Example
596
367
  # t.timestamps
597
368
  def timestamps
@@ -620,25 +391,25 @@ module ActiveRecord
620
391
  # t.remove(:qualification)
621
392
  # t.remove(:qualification, :experience)
622
393
  def remove(*column_names)
623
- @base.remove_column(@table_name, column_names)
394
+ @base.remove_column(@table_name, *column_names)
624
395
  end
625
396
 
626
397
  # Removes the given index from the table.
627
398
  #
628
399
  # ===== Examples
629
- # ====== Remove the suppliers_name_index in the suppliers table
630
- # t.remove_index :name
631
- # ====== Remove the index named accounts_branch_id_index in the accounts table
400
+ # ====== Remove the index_table_name_on_column in the table_name table
401
+ # t.remove_index :column
402
+ # ====== Remove the index named index_table_name_on_branch_id in the table_name table
632
403
  # t.remove_index :column => :branch_id
633
- # ====== Remove the index named accounts_branch_id_party_id_index in the accounts table
404
+ # ====== Remove the index named index_table_name_on_branch_id_and_party_id in the table_name table
634
405
  # t.remove_index :column => [:branch_id, :party_id]
635
- # ====== Remove the index named by_branch_party in the accounts table
406
+ # ====== Remove the index named by_branch_party in the table_name table
636
407
  # t.remove_index :name => :by_branch_party
637
408
  def remove_index(options = {})
638
409
  @base.remove_index(@table_name, options)
639
410
  end
640
411
 
641
- # Removes the timestamp columns (created_at and updated_at) from the table.
412
+ # Removes the timestamp columns (+created_at+ and +updated_at+) from the table.
642
413
  # ===== Example
643
414
  # t.remove_timestamps
644
415
  def remove_timestamps
@@ -652,7 +423,7 @@ module ActiveRecord
652
423
  @base.rename_column(@table_name, column_name, new_column_name)
653
424
  end
654
425
 
655
- # Adds a reference. Optionally adds a +type+ column.
426
+ # Adds a reference. Optionally adds a +type+ column, if <tt>:polymorphic</tt> option is provided.
656
427
  # <tt>references</tt> and <tt>belongs_to</tt> are acceptable.
657
428
  # ===== Examples
658
429
  # t.references(:goat)
@@ -689,17 +460,17 @@ module ActiveRecord
689
460
  # t.string(:goat)
690
461
  # t.string(:goat, :sheep)
691
462
  %w( string text integer float decimal datetime timestamp time date binary boolean ).each do |column_type|
692
- class_eval <<-EOV
463
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
693
464
  def #{column_type}(*args) # def string(*args)
694
465
  options = args.extract_options! # options = args.extract_options!
695
466
  column_names = args # column_names = args
696
- #
467
+ type = :'#{column_type}' # type = :string
697
468
  column_names.each do |name| # column_names.each do |name|
698
- column = ColumnDefinition.new(@base, name, '#{column_type}') # column = ColumnDefinition.new(@base, name, 'string')
469
+ column = ColumnDefinition.new(@base, name.to_s, type) # column = ColumnDefinition.new(@base, name, type)
699
470
  if options[:limit] # if options[:limit]
700
471
  column.limit = options[:limit] # column.limit = options[:limit]
701
- elsif native['#{column_type}'.to_sym].is_a?(Hash) # elsif native['string'.to_sym].is_a?(Hash)
702
- column.limit = native['#{column_type}'.to_sym][:limit] # column.limit = native['string'.to_sym][:limit]
472
+ elsif native[type].is_a?(Hash) # elsif native[type].is_a?(Hash)
473
+ column.limit = native[type][:limit] # column.limit = native[type][:limit]
703
474
  end # end
704
475
  column.precision = options[:precision] # column.precision = options[:precision]
705
476
  column.scale = options[:scale] # column.scale = options[:scale]
@@ -719,4 +490,3 @@ module ActiveRecord
719
490
 
720
491
  end
721
492
  end
722
-