activerecord 5.2.3

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +937 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +217 -0
  5. data/examples/performance.rb +185 -0
  6. data/examples/simple.rb +15 -0
  7. data/lib/active_record.rb +188 -0
  8. data/lib/active_record/aggregations.rb +283 -0
  9. data/lib/active_record/association_relation.rb +40 -0
  10. data/lib/active_record/associations.rb +1860 -0
  11. data/lib/active_record/associations/alias_tracker.rb +81 -0
  12. data/lib/active_record/associations/association.rb +299 -0
  13. data/lib/active_record/associations/association_scope.rb +168 -0
  14. data/lib/active_record/associations/belongs_to_association.rb +130 -0
  15. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +40 -0
  16. data/lib/active_record/associations/builder/association.rb +140 -0
  17. data/lib/active_record/associations/builder/belongs_to.rb +163 -0
  18. data/lib/active_record/associations/builder/collection_association.rb +82 -0
  19. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +135 -0
  20. data/lib/active_record/associations/builder/has_many.rb +17 -0
  21. data/lib/active_record/associations/builder/has_one.rb +30 -0
  22. data/lib/active_record/associations/builder/singular_association.rb +42 -0
  23. data/lib/active_record/associations/collection_association.rb +513 -0
  24. data/lib/active_record/associations/collection_proxy.rb +1131 -0
  25. data/lib/active_record/associations/foreign_association.rb +13 -0
  26. data/lib/active_record/associations/has_many_association.rb +144 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +227 -0
  28. data/lib/active_record/associations/has_one_association.rb +120 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency.rb +262 -0
  31. data/lib/active_record/associations/join_dependency/join_association.rb +60 -0
  32. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  33. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  34. data/lib/active_record/associations/preloader.rb +193 -0
  35. data/lib/active_record/associations/preloader/association.rb +131 -0
  36. data/lib/active_record/associations/preloader/through_association.rb +107 -0
  37. data/lib/active_record/associations/singular_association.rb +73 -0
  38. data/lib/active_record/associations/through_association.rb +121 -0
  39. data/lib/active_record/attribute_assignment.rb +88 -0
  40. data/lib/active_record/attribute_decorators.rb +90 -0
  41. data/lib/active_record/attribute_methods.rb +492 -0
  42. data/lib/active_record/attribute_methods/before_type_cast.rb +78 -0
  43. data/lib/active_record/attribute_methods/dirty.rb +150 -0
  44. data/lib/active_record/attribute_methods/primary_key.rb +143 -0
  45. data/lib/active_record/attribute_methods/query.rb +42 -0
  46. data/lib/active_record/attribute_methods/read.rb +85 -0
  47. data/lib/active_record/attribute_methods/serialization.rb +90 -0
  48. data/lib/active_record/attribute_methods/time_zone_conversion.rb +91 -0
  49. data/lib/active_record/attribute_methods/write.rb +68 -0
  50. data/lib/active_record/attributes.rb +266 -0
  51. data/lib/active_record/autosave_association.rb +498 -0
  52. data/lib/active_record/base.rb +329 -0
  53. data/lib/active_record/callbacks.rb +353 -0
  54. data/lib/active_record/coders/json.rb +15 -0
  55. data/lib/active_record/coders/yaml_column.rb +50 -0
  56. data/lib/active_record/collection_cache_key.rb +53 -0
  57. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +1068 -0
  58. data/lib/active_record/connection_adapters/abstract/database_limits.rb +72 -0
  59. data/lib/active_record/connection_adapters/abstract/database_statements.rb +540 -0
  60. data/lib/active_record/connection_adapters/abstract/query_cache.rb +145 -0
  61. data/lib/active_record/connection_adapters/abstract/quoting.rb +200 -0
  62. data/lib/active_record/connection_adapters/abstract/savepoints.rb +23 -0
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +146 -0
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +685 -0
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +95 -0
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1396 -0
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +283 -0
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +628 -0
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +887 -0
  70. data/lib/active_record/connection_adapters/column.rb +91 -0
  71. data/lib/active_record/connection_adapters/connection_specification.rb +287 -0
  72. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +33 -0
  73. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  74. data/lib/active_record/connection_adapters/mysql/database_statements.rb +140 -0
  75. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +72 -0
  76. data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +73 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +87 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +80 -0
  80. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +148 -0
  81. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +35 -0
  82. data/lib/active_record/connection_adapters/mysql2_adapter.rb +129 -0
  83. data/lib/active_record/connection_adapters/postgresql/column.rb +44 -0
  84. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +163 -0
  85. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  86. data/lib/active_record/connection_adapters/postgresql/oid.rb +34 -0
  87. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +92 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +56 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  90. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +50 -0
  92. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  93. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +23 -0
  94. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +21 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +71 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +45 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +41 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +65 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +97 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +111 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +23 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  109. data/lib/active_record/connection_adapters/postgresql/quoting.rb +168 -0
  110. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +43 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +65 -0
  112. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +206 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +50 -0
  114. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +774 -0
  115. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +39 -0
  116. data/lib/active_record/connection_adapters/postgresql/utils.rb +81 -0
  117. data/lib/active_record/connection_adapters/postgresql_adapter.rb +863 -0
  118. data/lib/active_record/connection_adapters/schema_cache.rb +118 -0
  119. data/lib/active_record/connection_adapters/sql_type_metadata.rb +34 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +67 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +106 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +573 -0
  127. data/lib/active_record/connection_adapters/statement_pool.rb +61 -0
  128. data/lib/active_record/connection_handling.rb +145 -0
  129. data/lib/active_record/core.rb +559 -0
  130. data/lib/active_record/counter_cache.rb +218 -0
  131. data/lib/active_record/define_callbacks.rb +22 -0
  132. data/lib/active_record/dynamic_matchers.rb +122 -0
  133. data/lib/active_record/enum.rb +244 -0
  134. data/lib/active_record/errors.rb +380 -0
  135. data/lib/active_record/explain.rb +50 -0
  136. data/lib/active_record/explain_registry.rb +32 -0
  137. data/lib/active_record/explain_subscriber.rb +34 -0
  138. data/lib/active_record/fixture_set/file.rb +82 -0
  139. data/lib/active_record/fixtures.rb +1065 -0
  140. data/lib/active_record/gem_version.rb +17 -0
  141. data/lib/active_record/inheritance.rb +283 -0
  142. data/lib/active_record/integration.rb +155 -0
  143. data/lib/active_record/internal_metadata.rb +45 -0
  144. data/lib/active_record/legacy_yaml_adapter.rb +48 -0
  145. data/lib/active_record/locale/en.yml +48 -0
  146. data/lib/active_record/locking/optimistic.rb +198 -0
  147. data/lib/active_record/locking/pessimistic.rb +89 -0
  148. data/lib/active_record/log_subscriber.rb +137 -0
  149. data/lib/active_record/migration.rb +1378 -0
  150. data/lib/active_record/migration/command_recorder.rb +240 -0
  151. data/lib/active_record/migration/compatibility.rb +217 -0
  152. data/lib/active_record/migration/join_table.rb +17 -0
  153. data/lib/active_record/model_schema.rb +521 -0
  154. data/lib/active_record/nested_attributes.rb +600 -0
  155. data/lib/active_record/no_touching.rb +58 -0
  156. data/lib/active_record/null_relation.rb +68 -0
  157. data/lib/active_record/persistence.rb +763 -0
  158. data/lib/active_record/query_cache.rb +45 -0
  159. data/lib/active_record/querying.rb +70 -0
  160. data/lib/active_record/railtie.rb +226 -0
  161. data/lib/active_record/railties/console_sandbox.rb +7 -0
  162. data/lib/active_record/railties/controller_runtime.rb +56 -0
  163. data/lib/active_record/railties/databases.rake +377 -0
  164. data/lib/active_record/readonly_attributes.rb +24 -0
  165. data/lib/active_record/reflection.rb +1044 -0
  166. data/lib/active_record/relation.rb +629 -0
  167. data/lib/active_record/relation/batches.rb +287 -0
  168. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  169. data/lib/active_record/relation/calculations.rb +417 -0
  170. data/lib/active_record/relation/delegation.rb +147 -0
  171. data/lib/active_record/relation/finder_methods.rb +565 -0
  172. data/lib/active_record/relation/from_clause.rb +26 -0
  173. data/lib/active_record/relation/merger.rb +193 -0
  174. data/lib/active_record/relation/predicate_builder.rb +152 -0
  175. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  176. data/lib/active_record/relation/predicate_builder/association_query_value.rb +46 -0
  177. data/lib/active_record/relation/predicate_builder/base_handler.rb +19 -0
  178. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +20 -0
  179. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +56 -0
  180. data/lib/active_record/relation/predicate_builder/range_handler.rb +42 -0
  181. data/lib/active_record/relation/predicate_builder/relation_handler.rb +19 -0
  182. data/lib/active_record/relation/query_attribute.rb +45 -0
  183. data/lib/active_record/relation/query_methods.rb +1231 -0
  184. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  185. data/lib/active_record/relation/spawn_methods.rb +77 -0
  186. data/lib/active_record/relation/where_clause.rb +186 -0
  187. data/lib/active_record/relation/where_clause_factory.rb +34 -0
  188. data/lib/active_record/result.rb +149 -0
  189. data/lib/active_record/runtime_registry.rb +24 -0
  190. data/lib/active_record/sanitization.rb +222 -0
  191. data/lib/active_record/schema.rb +70 -0
  192. data/lib/active_record/schema_dumper.rb +255 -0
  193. data/lib/active_record/schema_migration.rb +56 -0
  194. data/lib/active_record/scoping.rb +106 -0
  195. data/lib/active_record/scoping/default.rb +152 -0
  196. data/lib/active_record/scoping/named.rb +213 -0
  197. data/lib/active_record/secure_token.rb +40 -0
  198. data/lib/active_record/serialization.rb +22 -0
  199. data/lib/active_record/statement_cache.rb +121 -0
  200. data/lib/active_record/store.rb +211 -0
  201. data/lib/active_record/suppressor.rb +61 -0
  202. data/lib/active_record/table_metadata.rb +82 -0
  203. data/lib/active_record/tasks/database_tasks.rb +337 -0
  204. data/lib/active_record/tasks/mysql_database_tasks.rb +115 -0
  205. data/lib/active_record/tasks/postgresql_database_tasks.rb +143 -0
  206. data/lib/active_record/tasks/sqlite_database_tasks.rb +83 -0
  207. data/lib/active_record/timestamp.rb +153 -0
  208. data/lib/active_record/touch_later.rb +64 -0
  209. data/lib/active_record/transactions.rb +502 -0
  210. data/lib/active_record/translation.rb +24 -0
  211. data/lib/active_record/type.rb +79 -0
  212. data/lib/active_record/type/adapter_specific_registry.rb +136 -0
  213. data/lib/active_record/type/date.rb +9 -0
  214. data/lib/active_record/type/date_time.rb +9 -0
  215. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  216. data/lib/active_record/type/hash_lookup_type_map.rb +25 -0
  217. data/lib/active_record/type/internal/timezone.rb +17 -0
  218. data/lib/active_record/type/json.rb +30 -0
  219. data/lib/active_record/type/serialized.rb +71 -0
  220. data/lib/active_record/type/text.rb +11 -0
  221. data/lib/active_record/type/time.rb +21 -0
  222. data/lib/active_record/type/type_map.rb +62 -0
  223. data/lib/active_record/type/unsigned_integer.rb +17 -0
  224. data/lib/active_record/type_caster.rb +9 -0
  225. data/lib/active_record/type_caster/connection.rb +33 -0
  226. data/lib/active_record/type_caster/map.rb +23 -0
  227. data/lib/active_record/validations.rb +93 -0
  228. data/lib/active_record/validations/absence.rb +25 -0
  229. data/lib/active_record/validations/associated.rb +60 -0
  230. data/lib/active_record/validations/length.rb +26 -0
  231. data/lib/active_record/validations/presence.rb +68 -0
  232. data/lib/active_record/validations/uniqueness.rb +238 -0
  233. data/lib/active_record/version.rb +10 -0
  234. data/lib/rails/generators/active_record.rb +19 -0
  235. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +27 -0
  236. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  237. data/lib/rails/generators/active_record/migration.rb +35 -0
  238. data/lib/rails/generators/active_record/migration/migration_generator.rb +78 -0
  239. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  240. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +46 -0
  241. data/lib/rails/generators/active_record/model/model_generator.rb +48 -0
  242. data/lib/rails/generators/active_record/model/templates/model.rb.tt +13 -0
  243. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  244. metadata +333 -0
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2004-2018 David Heinemeier Hansson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,217 @@
1
+ = Active Record -- Object-relational mapping in Rails
2
+
3
+ Active Record connects classes to relational database tables to establish an
4
+ almost zero-configuration persistence layer for applications. The library
5
+ provides a base class that, when subclassed, sets up a mapping between the new
6
+ class and an existing table in the database. In the context of an application,
7
+ these classes are commonly referred to as *models*. Models can also be
8
+ connected to other models; this is done by defining *associations*.
9
+
10
+ Active Record relies heavily on naming in that it uses class and association
11
+ names to establish mappings between respective database tables and foreign key
12
+ columns. Although these mappings can be defined explicitly, it's recommended
13
+ to follow naming conventions, especially when getting started with the
14
+ library.
15
+
16
+ A short rundown of some of the major features:
17
+
18
+ * Automated mapping between classes and tables, attributes and columns.
19
+
20
+ class Product < ActiveRecord::Base
21
+ end
22
+
23
+ {Learn more}[link:classes/ActiveRecord/Base.html]
24
+
25
+ The Product class is automatically mapped to the table named "products",
26
+ which might look like this:
27
+
28
+ CREATE TABLE products (
29
+ id bigint NOT NULL auto_increment,
30
+ name varchar(255),
31
+ PRIMARY KEY (id)
32
+ );
33
+
34
+ This would also define the following accessors: <tt>Product#name</tt> and
35
+ <tt>Product#name=(new_name)</tt>.
36
+
37
+
38
+ * Associations between objects defined by simple class methods.
39
+
40
+ class Firm < ActiveRecord::Base
41
+ has_many :clients
42
+ has_one :account
43
+ belongs_to :conglomerate
44
+ end
45
+
46
+ {Learn more}[link:classes/ActiveRecord/Associations/ClassMethods.html]
47
+
48
+
49
+ * Aggregations of value objects.
50
+
51
+ class Account < ActiveRecord::Base
52
+ composed_of :balance, class_name: 'Money',
53
+ mapping: %w(balance amount)
54
+ composed_of :address,
55
+ mapping: [%w(address_street street), %w(address_city city)]
56
+ end
57
+
58
+ {Learn more}[link:classes/ActiveRecord/Aggregations/ClassMethods.html]
59
+
60
+
61
+ * Validation rules that can differ for new or existing objects.
62
+
63
+ class Account < ActiveRecord::Base
64
+ validates :subdomain, :name, :email_address, :password, presence: true
65
+ validates :subdomain, uniqueness: true
66
+ validates :terms_of_service, acceptance: true, on: :create
67
+ validates :password, :email_address, confirmation: true, on: :create
68
+ end
69
+
70
+ {Learn more}[link:classes/ActiveRecord/Validations.html]
71
+
72
+
73
+ * Callbacks available for the entire life cycle (instantiation, saving, destroying, validating, etc.).
74
+
75
+ class Person < ActiveRecord::Base
76
+ before_destroy :invalidate_payment_plan
77
+ # the `invalidate_payment_plan` method gets called just before Person#destroy
78
+ end
79
+
80
+ {Learn more}[link:classes/ActiveRecord/Callbacks.html]
81
+
82
+
83
+ * Inheritance hierarchies.
84
+
85
+ class Company < ActiveRecord::Base; end
86
+ class Firm < Company; end
87
+ class Client < Company; end
88
+ class PriorityClient < Client; end
89
+
90
+ {Learn more}[link:classes/ActiveRecord/Base.html]
91
+
92
+
93
+ * Transactions.
94
+
95
+ # Database transaction
96
+ Account.transaction do
97
+ david.withdrawal(100)
98
+ mary.deposit(100)
99
+ end
100
+
101
+ {Learn more}[link:classes/ActiveRecord/Transactions/ClassMethods.html]
102
+
103
+
104
+ * Reflections on columns, associations, and aggregations.
105
+
106
+ reflection = Firm.reflect_on_association(:clients)
107
+ reflection.klass # => Client (class)
108
+ Firm.columns # Returns an array of column descriptors for the firms table
109
+
110
+ {Learn more}[link:classes/ActiveRecord/Reflection/ClassMethods.html]
111
+
112
+
113
+ * Database abstraction through simple adapters.
114
+
115
+ # connect to SQLite3
116
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3')
117
+
118
+ # connect to MySQL with authentication
119
+ ActiveRecord::Base.establish_connection(
120
+ adapter: 'mysql2',
121
+ host: 'localhost',
122
+ username: 'me',
123
+ password: 'secret',
124
+ database: 'activerecord'
125
+ )
126
+
127
+ {Learn more}[link:classes/ActiveRecord/Base.html] and read about the built-in support for
128
+ MySQL[link:classes/ActiveRecord/ConnectionAdapters/Mysql2Adapter.html],
129
+ PostgreSQL[link:classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html], and
130
+ SQLite3[link:classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html].
131
+
132
+
133
+ * Logging support for Log4r[https://github.com/colbygk/log4r] and Logger[http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc].
134
+
135
+ ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT)
136
+ ActiveRecord::Base.logger = Log4r::Logger.new('Application Log')
137
+
138
+
139
+ * Database agnostic schema management with Migrations.
140
+
141
+ class AddSystemSettings < ActiveRecord::Migration[5.0]
142
+ def up
143
+ create_table :system_settings do |t|
144
+ t.string :name
145
+ t.string :label
146
+ t.text :value
147
+ t.string :type
148
+ t.integer :position
149
+ end
150
+
151
+ SystemSetting.create name: 'notice', label: 'Use notice?', value: 1
152
+ end
153
+
154
+ def down
155
+ drop_table :system_settings
156
+ end
157
+ end
158
+
159
+ {Learn more}[link:classes/ActiveRecord/Migration.html]
160
+
161
+
162
+ == Philosophy
163
+
164
+ Active Record is an implementation of the object-relational mapping (ORM)
165
+ pattern[https://www.martinfowler.com/eaaCatalog/activeRecord.html] by the same
166
+ name described by Martin Fowler:
167
+
168
+ "An object that wraps a row in a database table or view,
169
+ encapsulates the database access, and adds domain logic on that data."
170
+
171
+ Active Record attempts to provide a coherent wrapper as a solution for the inconvenience that is
172
+ object-relational mapping. The prime directive for this mapping has been to minimize
173
+ the amount of code needed to build a real-world domain model. This is made possible
174
+ by relying on a number of conventions that make it easy for Active Record to infer
175
+ complex relations and structures from a minimal amount of explicit direction.
176
+
177
+ Convention over Configuration:
178
+ * No XML files!
179
+ * Lots of reflection and run-time extension
180
+ * Magic is not inherently a bad word
181
+
182
+ Admit the Database:
183
+ * Lets you drop down to SQL for odd cases and performance
184
+ * Doesn't attempt to duplicate or replace data definitions
185
+
186
+
187
+ == Download and installation
188
+
189
+ The latest version of Active Record can be installed with RubyGems:
190
+
191
+ $ gem install activerecord
192
+
193
+ Source code can be downloaded as part of the Rails project on GitHub:
194
+
195
+ * https://github.com/rails/rails/tree/5-2-stable/activerecord
196
+
197
+
198
+ == License
199
+
200
+ Active Record is released under the MIT license:
201
+
202
+ * https://opensource.org/licenses/MIT
203
+
204
+
205
+ == Support
206
+
207
+ API documentation is at:
208
+
209
+ * http://api.rubyonrails.org
210
+
211
+ Bug reports for the Ruby on Rails project can be filed here:
212
+
213
+ * https://github.com/rails/rails/issues
214
+
215
+ Feature requests should be discussed on the rails-core mailing list here:
216
+
217
+ * https://groups.google.com/forum/?fromgroups#!forum/rubyonrails-core
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "benchmark/ips"
5
+
6
+ TIME = (ENV["BENCHMARK_TIME"] || 20).to_i
7
+ RECORDS = (ENV["BENCHMARK_RECORDS"] || TIME * 1000).to_i
8
+
9
+ conn = { adapter: "sqlite3", database: ":memory:" }
10
+
11
+ ActiveRecord::Base.establish_connection(conn)
12
+
13
+ class User < ActiveRecord::Base
14
+ connection.create_table :users, force: true do |t|
15
+ t.string :name, :email
16
+ t.timestamps
17
+ end
18
+
19
+ has_many :exhibits
20
+ end
21
+
22
+ class Exhibit < ActiveRecord::Base
23
+ connection.create_table :exhibits, force: true do |t|
24
+ t.belongs_to :user
25
+ t.string :name
26
+ t.text :notes
27
+ t.timestamps
28
+ end
29
+
30
+ belongs_to :user
31
+
32
+ def look; attributes end
33
+ def feel; look; user.name end
34
+
35
+ def self.with_name
36
+ where("name IS NOT NULL")
37
+ end
38
+
39
+ def self.with_notes
40
+ where("notes IS NOT NULL")
41
+ end
42
+
43
+ def self.look(exhibits) exhibits.each(&:look) end
44
+ def self.feel(exhibits) exhibits.each(&:feel) end
45
+ end
46
+
47
+ def progress_bar(int); print "." if (int % 100).zero? ; end
48
+
49
+ puts "Generating data..."
50
+
51
+ module ActiveRecord
52
+ class Faker
53
+ LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse non aliquet diam. Curabitur vel urna metus, quis malesuada elit.
54
+ Integer consequat tincidunt felis. Etiam non erat dolor. Vivamus imperdiet nibh sit amet diam eleifend id posuere diam malesuada. Mauris at accumsan sem.
55
+ Donec id lorem neque. Fusce erat lorem, ornare eu congue vitae, malesuada quis neque. Maecenas vel urna a velit pretium fermentum. Donec tortor enim,
56
+ tempor venenatis egestas a, tempor sed ipsum. Ut arcu justo, faucibus non imperdiet ac, interdum at diam. Pellentesque ipsum enim, venenatis ut iaculis vitae,
57
+ varius vitae sem. Sed rutrum quam ac elit euismod bibendum. Donec ultricies ultricies magna, at lacinia libero mollis aliquam. Sed ac arcu in tortor elementum
58
+ tincidunt vel interdum sem. Curabitur eget erat arcu. Praesent eget eros leo. Nam magna enim, sollicitudin vehicula scelerisque in, vulputate ut libero.
59
+ Praesent varius tincidunt commodo".split
60
+
61
+ def self.name
62
+ LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join " "
63
+ end
64
+
65
+ def self.email
66
+ LOREM.grep(/^\w*$/).sort_by { rand }.first(2).join("@") + ".com"
67
+ end
68
+ end
69
+ end
70
+
71
+ # pre-compute the insert statements and fake data compilation,
72
+ # so the benchmarks below show the actual runtime for the execute
73
+ # method, minus the setup steps
74
+
75
+ # Using the same paragraph for all exhibits because it is very slow
76
+ # to generate unique paragraphs for all exhibits.
77
+ notes = ActiveRecord::Faker::LOREM.join " "
78
+ today = Date.today
79
+
80
+ puts "Inserting #{RECORDS} users and exhibits..."
81
+ RECORDS.times do |record|
82
+ user = User.create(
83
+ created_at: today,
84
+ name: ActiveRecord::Faker.name,
85
+ email: ActiveRecord::Faker.email
86
+ )
87
+
88
+ Exhibit.create(
89
+ created_at: today,
90
+ name: ActiveRecord::Faker.name,
91
+ user: user,
92
+ notes: notes
93
+ )
94
+ progress_bar(record)
95
+ end
96
+ puts "Done!\n"
97
+
98
+ Benchmark.ips(TIME) do |x|
99
+ ar_obj = Exhibit.find(1)
100
+ attrs = { name: "sam" }
101
+ attrs_first = { name: "sam" }
102
+ attrs_second = { name: "tom" }
103
+ exhibit = {
104
+ name: ActiveRecord::Faker.name,
105
+ notes: notes,
106
+ created_at: Date.today
107
+ }
108
+
109
+ x.report("Model#id") do
110
+ ar_obj.id
111
+ end
112
+
113
+ x.report "Model.new (instantiation)" do
114
+ Exhibit.new
115
+ end
116
+
117
+ x.report "Model.new (setting attributes)" do
118
+ Exhibit.new(attrs)
119
+ end
120
+
121
+ x.report "Model.first" do
122
+ Exhibit.first.look
123
+ end
124
+
125
+ x.report "Model.take" do
126
+ Exhibit.take
127
+ end
128
+
129
+ x.report("Model.all limit(100)") do
130
+ Exhibit.look Exhibit.limit(100)
131
+ end
132
+
133
+ x.report("Model.all take(100)") do
134
+ Exhibit.look Exhibit.take(100)
135
+ end
136
+
137
+ x.report "Model.all limit(100) with relationship" do
138
+ Exhibit.feel Exhibit.limit(100).includes(:user)
139
+ end
140
+
141
+ x.report "Model.all limit(10,000)" do
142
+ Exhibit.look Exhibit.limit(10000)
143
+ end
144
+
145
+ x.report "Model.named_scope" do
146
+ Exhibit.limit(10).with_name.with_notes
147
+ end
148
+
149
+ x.report "Model.create" do
150
+ Exhibit.create(exhibit)
151
+ end
152
+
153
+ x.report "Resource#attributes=" do
154
+ e = Exhibit.new(attrs_first)
155
+ e.attributes = attrs_second
156
+ end
157
+
158
+ x.report "Resource#update" do
159
+ Exhibit.first.update(name: "bob")
160
+ end
161
+
162
+ x.report "Resource#destroy" do
163
+ Exhibit.first.destroy
164
+ end
165
+
166
+ x.report "Model.transaction" do
167
+ Exhibit.transaction { Exhibit.new }
168
+ end
169
+
170
+ x.report "Model.find(id)" do
171
+ User.find(1)
172
+ end
173
+
174
+ x.report "Model.find_by_sql" do
175
+ Exhibit.find_by_sql("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}").first
176
+ end
177
+
178
+ x.report "Model.log" do
179
+ Exhibit.connection.send(:log, "hello", "world") {}
180
+ end
181
+
182
+ x.report "AR.execute(query)" do
183
+ ActiveRecord::Base.connection.execute("SELECT * FROM exhibits WHERE id = #{(rand * 1000 + 1).to_i}")
184
+ end
185
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ class Person < ActiveRecord::Base
6
+ establish_connection adapter: "sqlite3", database: "foobar.db"
7
+ connection.create_table table_name, force: true do |t|
8
+ t.string :name
9
+ end
10
+ end
11
+
12
+ bob = Person.create!(name: "bob")
13
+ puts Person.all.inspect
14
+ bob.destroy
15
+ puts Person.all.inspect
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ #--
4
+ # Copyright (c) 2004-2018 David Heinemeier Hansson
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining
7
+ # a copy of this software and associated documentation files (the
8
+ # "Software"), to deal in the Software without restriction, including
9
+ # without limitation the rights to use, copy, modify, merge, publish,
10
+ # distribute, sublicense, and/or sell copies of the Software, and to
11
+ # permit persons to whom the Software is furnished to do so, subject to
12
+ # the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be
15
+ # included in all copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ #++
25
+
26
+ require "active_support"
27
+ require "active_support/rails"
28
+ require "active_model"
29
+ require "arel"
30
+ require "yaml"
31
+
32
+ require "active_record/version"
33
+ require "active_model/attribute_set"
34
+
35
+ module ActiveRecord
36
+ extend ActiveSupport::Autoload
37
+
38
+ autoload :Base
39
+ autoload :Callbacks
40
+ autoload :Core
41
+ autoload :ConnectionHandling
42
+ autoload :CounterCache
43
+ autoload :DynamicMatchers
44
+ autoload :Enum
45
+ autoload :InternalMetadata
46
+ autoload :Explain
47
+ autoload :Inheritance
48
+ autoload :Integration
49
+ autoload :Migration
50
+ autoload :Migrator, "active_record/migration"
51
+ autoload :ModelSchema
52
+ autoload :NestedAttributes
53
+ autoload :NoTouching
54
+ autoload :TouchLater
55
+ autoload :Persistence
56
+ autoload :QueryCache
57
+ autoload :Querying
58
+ autoload :CollectionCacheKey
59
+ autoload :ReadonlyAttributes
60
+ autoload :RecordInvalid, "active_record/validations"
61
+ autoload :Reflection
62
+ autoload :RuntimeRegistry
63
+ autoload :Sanitization
64
+ autoload :Schema
65
+ autoload :SchemaDumper
66
+ autoload :SchemaMigration
67
+ autoload :Scoping
68
+ autoload :Serialization
69
+ autoload :StatementCache
70
+ autoload :Store
71
+ autoload :Suppressor
72
+ autoload :Timestamp
73
+ autoload :Transactions
74
+ autoload :Translation
75
+ autoload :Validations
76
+ autoload :SecureToken
77
+
78
+ eager_autoload do
79
+ autoload :ActiveRecordError, "active_record/errors"
80
+ autoload :ConnectionNotEstablished, "active_record/errors"
81
+ autoload :ConnectionAdapters, "active_record/connection_adapters/abstract_adapter"
82
+
83
+ autoload :Aggregations
84
+ autoload :Associations
85
+ autoload :AttributeAssignment
86
+ autoload :AttributeMethods
87
+ autoload :AutosaveAssociation
88
+
89
+ autoload :LegacyYamlAdapter
90
+
91
+ autoload :Relation
92
+ autoload :AssociationRelation
93
+ autoload :NullRelation
94
+
95
+ autoload_under "relation" do
96
+ autoload :QueryMethods
97
+ autoload :FinderMethods
98
+ autoload :Calculations
99
+ autoload :PredicateBuilder
100
+ autoload :SpawnMethods
101
+ autoload :Batches
102
+ autoload :Delegation
103
+ end
104
+
105
+ autoload :Result
106
+ autoload :TableMetadata
107
+ autoload :Type
108
+ end
109
+
110
+ module Coders
111
+ autoload :YAMLColumn, "active_record/coders/yaml_column"
112
+ autoload :JSON, "active_record/coders/json"
113
+ end
114
+
115
+ module AttributeMethods
116
+ extend ActiveSupport::Autoload
117
+
118
+ eager_autoload do
119
+ autoload :BeforeTypeCast
120
+ autoload :Dirty
121
+ autoload :PrimaryKey
122
+ autoload :Query
123
+ autoload :Read
124
+ autoload :TimeZoneConversion
125
+ autoload :Write
126
+ autoload :Serialization
127
+ end
128
+ end
129
+
130
+ module Locking
131
+ extend ActiveSupport::Autoload
132
+
133
+ eager_autoload do
134
+ autoload :Optimistic
135
+ autoload :Pessimistic
136
+ end
137
+ end
138
+
139
+ module ConnectionAdapters
140
+ extend ActiveSupport::Autoload
141
+
142
+ eager_autoload do
143
+ autoload :AbstractAdapter
144
+ end
145
+ end
146
+
147
+ module Scoping
148
+ extend ActiveSupport::Autoload
149
+
150
+ eager_autoload do
151
+ autoload :Named
152
+ autoload :Default
153
+ end
154
+ end
155
+
156
+ module Tasks
157
+ extend ActiveSupport::Autoload
158
+
159
+ autoload :DatabaseTasks
160
+ autoload :SQLiteDatabaseTasks, "active_record/tasks/sqlite_database_tasks"
161
+ autoload :MySQLDatabaseTasks, "active_record/tasks/mysql_database_tasks"
162
+ autoload :PostgreSQLDatabaseTasks,
163
+ "active_record/tasks/postgresql_database_tasks"
164
+ end
165
+
166
+ autoload :TestFixtures, "active_record/fixtures"
167
+
168
+ def self.eager_load!
169
+ super
170
+ ActiveRecord::Locking.eager_load!
171
+ ActiveRecord::Scoping.eager_load!
172
+ ActiveRecord::Associations.eager_load!
173
+ ActiveRecord::AttributeMethods.eager_load!
174
+ ActiveRecord::ConnectionAdapters.eager_load!
175
+ end
176
+ end
177
+
178
+ ActiveSupport.on_load(:active_record) do
179
+ Arel::Table.engine = self
180
+ end
181
+
182
+ ActiveSupport.on_load(:i18n) do
183
+ I18n.load_path << File.expand_path("active_record/locale/en.yml", __dir__)
184
+ end
185
+
186
+ YAML.load_tags["!ruby/object:ActiveRecord::AttributeSet"] = "ActiveModel::AttributeSet"
187
+ YAML.load_tags["!ruby/object:ActiveRecord::Attribute::FromDatabase"] = "ActiveModel::Attribute::FromDatabase"
188
+ YAML.load_tags["!ruby/object:ActiveRecord::LazyAttributeHash"] = "ActiveModel::LazyAttributeHash"