sequel 4.36.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -16,13 +16,13 @@ database tables. Without associations, if you had classes such as:
16
16
  And you wanted to get all of the albums for a given artist (assuming each
17
17
  album was associated with only one artist):
18
18
 
19
- Album.filter(:artist_id=>@artist.id).all
19
+ Album.where(artist_id: @artist.id).all
20
20
 
21
21
  Or maybe you want to add an album for a given artist:
22
22
 
23
- Album.create(:artist_id=>@artist.id, :name=>'RF')
23
+ Album.create(artist_id: @artist.id, name: 'RF')
24
24
 
25
- With Associations, you can make the above code simpler, by setting up associations
25
+ With associations, you can make the above code simpler, by setting up associations
26
26
  between the two models:
27
27
 
28
28
  class Artist < Sequel::Model
@@ -39,9 +39,9 @@ Then, the code to retrieve albums related to the artist is simpler:
39
39
 
40
40
  As is the code to add a related album to an artist:
41
41
 
42
- @artist.add_album(:name=>'RF')
42
+ @artist.add_album(name: 'RF')
43
43
 
44
- It also makes it easier to creating queries that use joins based on the association:
44
+ It also makes it easier to create queries that use joins based on the association:
45
45
 
46
46
  Artist.association_join(:albums)
47
47
  # SELECT * FROM artists
@@ -63,8 +63,8 @@ It ships with additional association types via plugins.
63
63
 
64
64
  The many_to_one association is used when the table for the current class
65
65
  contains a foreign key that references the primary key in the table for the
66
- associated class. It is named because there can be many rows in the current
67
- table for each row in the associated table.
66
+ associated class. It is named 'many_to_one' because there can be many rows
67
+ in the current table for each row in the associated table.
68
68
 
69
69
  # Database schema:
70
70
  # albums artists
@@ -81,8 +81,8 @@ table for each row in the associated table.
81
81
 
82
82
  The one_to_many association is used when the table for the associated class
83
83
  contains a foreign key that references the primary key in the table for the
84
- current class. It is named because for each row in the current table there
85
- can be many rows in the associated table:
84
+ current class. It is named 'one_to_many' because for each row in the
85
+ current table there can be many rows in the associated table:
86
86
 
87
87
  The one_to_one association can be thought of as a subset of the one_to_many association,
88
88
  but where there can only be either 0 or 1 records in the associated table. This is
@@ -109,13 +109,11 @@ first record returned.
109
109
  The many_to_many association allows each row in the current table to be associated
110
110
  to many rows in the associated table, and each row in the associated table to
111
111
  many rows in the current table, by using a join table to associate the two tables.
112
- If you assume each artist can have multiple albums and each album can have multiple
113
- artists:
114
112
 
115
113
  The one_through_one association can be thought of as a subset of the many_to_many
116
114
  association, but where there can only be 0 or 1 records in the associated table.
117
115
  This is useful if there is a unique constraint on the foreign key in the join table
118
- that refrences the current table. It's also useful if you want to impose an order
116
+ that references the current table. It's also useful if you want to impose an order
119
117
  on the association and just want the first record returned. The one_through_one
120
118
  association is so named because it sets up a one-to-one association through a
121
119
  single join table.
@@ -188,10 +186,10 @@ Then the default :key option will not be correct. To fix this, you need to
188
186
  specify an explicit :key option:
189
187
 
190
188
  class Album
191
- many_to_one :artist, :key=>:artistid
189
+ many_to_one :artist, key: :artistid
192
190
  end
193
191
  class Artist
194
- one_to_many :albums, :key=>:artistid
192
+ one_to_many :albums, key: :artistid
195
193
  end
196
194
 
197
195
  For many_to_many associations, the :left_key and :right_key options can be
@@ -211,17 +209,17 @@ option can be used to specify the name of the join table:
211
209
  # Note that :left_key refers to the foreign key pointing to the
212
210
  # current table, and :right_key the foreign key pointing to the
213
211
  # associated table.
214
- many_to_many :albums, :left_key=>:artistid, :right_key=>:albumid,
215
- :join_table=>:albumsartists
212
+ many_to_many :albums, left_key: :artistid, right_key: :albumid,
213
+ join_table: :albumsartists
216
214
  end
217
215
  class Album
218
- many_to_many :artists, :left_key=>:albumid, :right_key=>:artistid,
219
- :join_table=>:albumsartists
216
+ many_to_many :artists, left_key: :albumid, right_key: :artistid,
217
+ join_table: :albumsartists
220
218
  end
221
219
 
222
220
  === :class
223
221
 
224
- If the class of the association can not be guessed directly by looking at
222
+ If the class of the association cannot be guessed directly by looking at
225
223
  the association name, you need to specify it via the :class option. For
226
224
  example, if you have two separate foreign keys in the albums table that
227
225
  both point to the artists table, maybe to indicate one artist is the
@@ -235,12 +233,12 @@ vocalist and one is the composer, you'd have to use the :class option:
235
233
  # :name
236
234
 
237
235
  class Album
238
- many_to_one :vocalist, :class=>:Artist
239
- many_to_one :composer, :class=>:Artist
236
+ many_to_one :vocalist, class: :Artist
237
+ many_to_one :composer, class: :Artist
240
238
  end
241
239
  class Artist
242
- one_to_many :vocalist_albums, :class=>:Album, :key=>:vocalist_id
243
- one_to_many :composer_albums, :class=>:Album, :key=>:composer_id
240
+ one_to_many :vocalist_albums, class: :Album, key: :vocalist_id
241
+ one_to_many :composer_albums, class: :Album, key: :composer_id
244
242
  end
245
243
 
246
244
  == Self-referential Associations
@@ -255,8 +253,8 @@ example is a tree structure:
255
253
  # :name
256
254
 
257
255
  class Node
258
- many_to_one :parent, :class=>self
259
- one_to_many :children, :key=>:parent_id, :class=>self
256
+ many_to_one :parent, class: self
257
+ one_to_many :children, key: :parent_id, class: self
260
258
  end
261
259
 
262
260
  For many_to_many self_referential associations, it's fairly similar. Here's
@@ -268,10 +266,10 @@ an example of a directed graph:
268
266
  # :name \----- :predecessor_id
269
267
 
270
268
  class Node
271
- many_to_many :direct_predecessors, :left_key=>:successor_id,
272
- :right_key=>:predecessor_id, :join_table=>:edges, :class=>self
273
- many_to_many :direct_successors, :right_key=>:successor_id,
274
- :left_key=>:predecessor_id, :join_table=>:edges, :class=>self
269
+ many_to_many :direct_predecessors, left_key: :successor_id,
270
+ right_key: :predecessor_id, join_table: :edges, class: self
271
+ many_to_many :direct_successors, right_key: :successor_id,
272
+ left_key: :predecessor_id, join_table: :edges, class: self
275
273
  end
276
274
 
277
275
  == Methods Added
@@ -288,13 +286,13 @@ same name as the association:
288
286
  many_to_one and one_to_one associations will also have a setter method
289
287
  added to change the associated object:
290
288
 
291
- @album.artist = Artist.create(:name=>'YJM')
289
+ @album.artist = Artist.create(name: 'YJM')
292
290
 
293
291
  many_to_many and one_to_many associations will have three methods added:
294
292
 
295
- - add_* to associate an object to the current object
296
- - remove_* to disassociate an object from the current object
297
- - remove_all_* to dissociate all currently associated objects
293
+ add_* :: to associate an object to the current object
294
+ remove_* :: to disassociate an object from the current object
295
+ remove_all_* :: to dissociate all currently associated objects
298
296
 
299
297
  Examples:
300
298
 
@@ -305,7 +303,11 @@ Examples:
305
303
  Note that the remove_all_* method does not call remove hooks defined on
306
304
  the association, it just issues a single query to the database. If you
307
305
  want to remove all associated objects and call remove hooks, iterate
308
- over the array of associated objects and call remove_* for each.
306
+ over the array of associated objects and call remove_* for each:
307
+
308
+ @artist.albums.each do |album|
309
+ @artist.remove_album(album)
310
+ end
309
311
 
310
312
  == Caching
311
313
 
@@ -318,11 +320,11 @@ Associations are cached after being retrieved:
318
320
  @album.artists # Cached - No Database Query
319
321
 
320
322
  You can choose to ignore the cached versions and do a database query to
321
- retrieve results by passing a true argument to the association method:
323
+ retrieve results by passing a :reload=>true option to the association method:
322
324
 
323
325
  @album.artists # Not cached - Database Query
324
326
  @album.artists # Cached - No Database Query
325
- @album.artists(true) # Ignore cache - Database Query
327
+ @album.artists(:reload=>true) # Ignore cache - Database Query
326
328
 
327
329
  If you reload/refresh the object, it will automatically clear the
328
330
  associations cache for the object:
@@ -342,7 +344,7 @@ instance method:
342
344
 
343
345
  == Dataset Method
344
346
 
345
- In addition to the above methods, associations also add a instance method
347
+ In addition to the above methods, associations also add an instance method
346
348
  ending in +_dataset+ that returns a dataset representing the objects in the associated table:
347
349
 
348
350
  @album.artist_id
@@ -398,70 +400,70 @@ all albums for a given artist, you would usually do:
398
400
 
399
401
  You can also do the following:
400
402
 
401
- Album.where(:artist=>@artist).all
403
+ Album.where(artist: @artist).all
402
404
  # or leave off the .all for a dataset
403
405
 
404
406
  For filtering by a single association, this isn't very useful. However, unlike
405
407
  using the association method, using a filter allows you to filter by multiple
406
408
  associations:
407
409
 
408
- Album.where(:artist=>@artist, :publisher=>@publisher)
410
+ Album.where(artist: @artist, publisher: @publisher)
409
411
 
410
412
  This will return all albums by that artist and published by that publisher.
411
413
  This isn't possible using just the association method approach, though you
412
414
  can combine the approaches:
413
415
 
414
- @artist.albums_dataset.where(:publisher=>@publisher)
416
+ @artist.albums_dataset.where(publisher: @publisher)
415
417
 
416
418
  This doesn't just work for +many_to_one+ associations, it also works for
417
419
  the other associations:
418
420
 
419
421
  Album.one_to_one :album_info
420
422
  # The album related to that AlbumInfo instance
421
- Album.where(:album_info=>AlbumInfo[2])
423
+ Album.where(album_info: AlbumInfo[2])
422
424
 
423
425
  Album.one_to_many :tracks
424
426
  # The album related to that Track instance
425
- Album.where(:tracks=>Track[3])
427
+ Album.where(tracks: Track[3])
426
428
 
427
429
  Album.many_to_many :tags
428
430
  # All albums related to that Tag instance
429
- Album.where(:tags=>Tag[4])
431
+ Album.where(tags: Tag[4])
430
432
 
431
433
  Album.one_through_one :tag
432
434
  # All albums related to that Tag instance
433
- Album.where(:tag=>Tag[4])
435
+ Album.where(tag: Tag[4])
434
436
 
435
437
  Note that for +one_to_many+ and +many_to_many+ associations, you still
436
438
  use the plural form even though only a single model object is given.
437
439
 
438
440
  You can also exclude by associations:
439
441
 
440
- Album.exclude(:artist=>@artist).all
442
+ Album.exclude(artist: @artist).all
441
443
 
442
444
  This will return all albums not by that artist.
443
445
 
444
446
  You can also provide an array with multiple model objects:
445
447
 
446
- Album.where(:artist=>[@artist1, @artist2]).all
448
+ Album.where(artist: [@artist1, @artist2]).all
447
449
 
448
450
  Similar to using an array of integers or strings, this will return
449
451
  all albums whose artist is one of those two artists. You can also
450
452
  use +exclude+ if you want all albums not by either of those artists:
451
453
 
452
- Album.exclude(:artist=>[@artist1, @artist2]).all
454
+ Album.exclude(artist: [@artist1, @artist2]).all
453
455
 
454
456
  If you are using a +one_to_many+ or +many_to_many+ association, you
455
457
  may want to return records where the records matches all of multiple
456
458
  records, instead of matching any of them. For example:
457
459
 
458
- Album.where(:tags=>[@tag1, @tag2])
460
+ Album.where(tags: [@tag1, @tag2])
459
461
 
460
462
  This matches albums that are associated with either @tag1 or @tag2 or
461
463
  both. If you only want ones that you are associated with both, you can
462
464
  use separate filter calls:
463
465
 
464
- Album.where(:tags=>@tag1).where(:tags=>@tag2)
466
+ Album.where(tags: @tag1).where(tags: @tag2)
465
467
 
466
468
  Or the array form of condition specifiers:
467
469
 
@@ -471,22 +473,22 @@ These will return albums associated with both @tag1 and @tag2.
471
473
 
472
474
  You can also provide a dataset value when filtering by associations:
473
475
 
474
- Album.where(:artist=>Artist.where(Sequel.like(:name, 'A%'))).all
476
+ Album.where(artist: Artist.where(Sequel.like(:name, 'A%'))).all
475
477
 
476
478
  This will return all albums whose artist starts with 'A'. Like
477
479
  the other forms, this can be inverted:
478
480
 
479
- Album.exclude(:artist=>Artist.where(Sequel.like(:name, 'A%'))).all
481
+ Album.exclude(artist: Artist.where(Sequel.like(:name, 'A%'))).all
480
482
 
481
483
  This will return all albums whose artist does not start with 'A'.
482
484
 
483
485
  Filtering by associations even works for associations that have
484
486
  conditions added via the :conditions option or a block:
485
487
 
486
- Album.one_to_many :popular_tags, :clone=>:tags do |ds|
488
+ Album.one_to_many :popular_tags, clone: :tags do |ds|
487
489
  ds.where{times_used > 1000}
488
490
  end
489
- Album.where(:popular_tags=>[@tag1, @tag2])
491
+ Album.where(popular_tags: [@tag1, @tag2])
490
492
 
491
493
  This will return all albums that whose popular tags would include
492
494
  at least one of those tags.
@@ -530,14 +532,14 @@ Which could be created using the following Sequel code:
530
532
  DB.create_table(:artists) do
531
533
  # Primary key must be set explicitly
532
534
  primary_key :id
533
- String :name
535
+ String :name, :null=>false, :unique=>true
534
536
  end
535
537
  DB.create_table(:albums) do
536
538
  primary_key :id
537
539
  # Table that foreign key references needs to be set explicitly
538
540
  # for a database foreign key reference to be created.
539
- foreign_key :artist_id, :artists
540
- String :name
541
+ foreign_key :artist_id, :artists, :null=>false
542
+ String :name, :null=>false, :unique=>true
541
543
  end
542
544
 
543
545
  If you already had a schema such as:
@@ -550,7 +552,7 @@ If you already had a schema such as:
550
552
  Then you just need to add the column:
551
553
 
552
554
  DB.alter_table(:albums) do
553
- add_foreign_key :artist_id, :artists
555
+ add_foreign_key :artist_id, :artists, :null=>false
554
556
  end
555
557
 
556
558
  === many_to_many
@@ -589,8 +591,10 @@ You could use the following Sequel code:
589
591
  DB.create_join_table(:album_id=>:albums, :artist_id=>:artists)
590
592
  # or
591
593
  DB.create_table(:albums_artists) do
592
- foreign_key :album_id, :albums
593
- foreign_key :artist_id, :artists
594
+ foreign_key :album_id, :albums, :null=>false
595
+ foreign_key :artist_id, :artists, :null=>false
596
+ primary_key [:album_id, :artist_id]
597
+ index [:artist_id, :album_id]
594
598
  end
595
599
 
596
600
  == Association Scope
@@ -627,12 +631,12 @@ To fix this, you need to specify the full model class name using the
627
631
 
628
632
  module App1
629
633
  class Artist < Sequel::Model
630
- one_to_many :albums, :class=>"App2::Album"
634
+ one_to_many :albums, class: "App2::Album"
631
635
  end
632
636
  end
633
637
  module App2
634
638
  class Album < Sequel::Model
635
- many_to_one :artist, :class=>"App1::Artist"
639
+ many_to_one :artist, class: "App1::Artist"
636
640
  end
637
641
  end
638
642
 
@@ -645,7 +649,7 @@ used is not correct, you need to specify the full class name with the
645
649
  one_to_many :albums
646
650
  end
647
651
  class Album < Sequel::Model
648
- many_to_one :artist, :class=>"App1::AlbumArtist"
652
+ many_to_one :artist, class: "App1::AlbumArtist"
649
653
  end
650
654
  end
651
655
 
@@ -654,7 +658,7 @@ used is not correct, you need to specify the full class name with the
654
658
  In all of these methods, _association_ is replaced by the symbol you
655
659
  pass to the association.
656
660
 
657
- === _association_(reload = false) (e.g. albums)
661
+ === _association_(opts={}) (e.g. albums)
658
662
 
659
663
  For +many_to_one+ and +one_to_one+ associations, the _association_ method
660
664
  returns either the single object associated, or nil if no object is
@@ -698,11 +702,11 @@ association name is used in this method.
698
702
  In addition to passing an actual associated object, you can pass a hash,
699
703
  and a new associated object will be created from them:
700
704
 
701
- @artist.add_album(:name=>'RF') # creates Album object
705
+ @artist.add_album(name: 'RF') # creates Album object
702
706
 
703
707
  The add_<i>association</i> method returns the new associated object:
704
708
 
705
- @album = @artist.add_album(:name=>'RF')
709
+ @album = @artist.add_album(name: 'RF')
706
710
 
707
711
  Note that the add_* methods for +one_to_many+ persist the changes by
708
712
  saving the passed in (or newly created) object. However, to avoid
@@ -777,7 +781,7 @@ Sequel is designed to be very flexible. If the default behavior of the
777
781
  association modification methods isn't what you desire, you can override
778
782
  the methods in your classes. However, you should be aware that for each
779
783
  of the association modification methods described, there is a private
780
- method that is preceeded by an underscore that does the actual
784
+ method that is preceded by an underscore that does the actual
781
785
  modification. The public method without the underscore handles caching
782
786
  and callbacks, and shouldn't be overridden by the user.
783
787
 
@@ -787,7 +791,7 @@ only difference between the two is that if you use an association option
787
791
  to change the method Sequel defines, you cannot call super to get the
788
792
  default behavior.
789
793
 
790
- === _<i>association</i>= (:setter option)
794
+ === :setter (_<i>association</i>= method)
791
795
 
792
796
  Let's say you want to set a specific field whenever associating an object
793
797
  using the association setter method. For example, let's say you have
@@ -796,11 +800,7 @@ album is associated with an artist, it should be filed under the artist's
796
800
  name and the album's name, otherwise it should just use the album's name.
797
801
 
798
802
  class Album < Sequel::Model
799
- many_to_one :artist
800
-
801
- private
802
-
803
- def _artist=(artist)
803
+ many_to_one :artist, setter: (lambda do |artist|
804
804
  if artist
805
805
  self.artist_id = artist.id
806
806
  self.file_under = "#{artist.name}-#{name}"
@@ -808,70 +808,84 @@ name and the album's name, otherwise it should just use the album's name.
808
808
  self.artist_id = nil
809
809
  self.file_under = name
810
810
  end
811
- end
811
+ end)
812
812
  end
813
813
 
814
814
  The above example is contrived, as you would generally use a before_save model
815
815
  hook to handle such a modification. However, if you only modify the album's
816
816
  artist using the artist= method, this approach may perform better.
817
817
 
818
- === \_add_<i>association</i> (:adder option)
818
+ === :adder (\_add_<i>association</i> method)
819
819
 
820
820
  Continuing with the same example, here's how you would handle the same case if
821
821
  you also wanted to handle the Artist#add_album method:
822
822
 
823
823
  class Artist < Sequel::Model
824
- one_to_many :albums
825
-
826
- private
827
-
828
- def _add_album(album)
829
- album.update(:artist_id => id, :file_under=>"#{name}-#{album.name}")
830
- end
824
+ one_to_many :albums, adder: (lambda do |album|
825
+ album.update(artist_id: id, file_under: "#{name}-#{album.name}")
826
+ end)
831
827
  end
832
828
 
833
- === \_remove_<i>association</i> (:remover option)
829
+ You can set this to +nil+ to not create a add_<i>association</i> method.
830
+
831
+ === :remover (\_remove_<i>association</i> method)
834
832
 
835
833
  Continuing with the same example, here's how you would handle the same case if
836
834
  you also wanted to handle the Artist#remove_album method:
837
835
 
838
836
  class Artist < Sequel::Model
839
- one_to_many :albums
840
-
841
- private
842
-
843
- def _remove_album(album)
844
- album.update(:artist_id => nil, :file_under=>album.name)
845
- end
837
+ one_to_many :albums, remover: (lambda do |album|
838
+ album.update(artist_id: nil, file_under: album.name)
839
+ end)
846
840
  end
847
841
 
848
- === \_remove_all_<i>association</i> (:clearer option)
842
+ You can set this to +nil+ to not create a remove_<i>association</i> method.
843
+
844
+ === :clearer (\_remove_all_<i>association</i> method)
849
845
 
850
846
  Continuing with the same example, here's how you would handle the same case if
851
847
  you also wanted to handle the Artist#remove_all_albums method:
852
848
 
853
849
  class Artist < Sequel::Model
854
- one_to_many :albums
855
-
856
- private
857
-
858
- def _remove_all_albums
859
- # This is Dataset#update, not Model#update, so the :file_under=>:name
850
+ one_to_many :albums, clearer: (lambda do
851
+ # This is Dataset#update, not Model#update, so the file_under: :name
860
852
  # ends up being "SET file_under = name" in SQL.
861
- albums_dataset.update(:artist_id => nil, :file_under=>:name)
862
- end
853
+ albums_dataset.update(artist_id: nil, file_under: :name)
854
+ end)
863
855
  end
864
856
 
857
+ You can set this to +nil+ to not create a remove_all_<i>association</i> method.
858
+
859
+ === :no_dataset_method
860
+
861
+ Setting this to true will not result in the <i>association</i>_dataset method
862
+ not being defined. This can save memory if you only use the <i>association</i>
863
+ method and do not call the <i>association</i>_dataset method directly or
864
+ indirectly.
865
+
866
+ === :no_association_method
867
+
868
+ Setting this to true will not result in the <i>association</i> method
869
+ not being defined. This can save memory if you only use the
870
+ <i>association</i>_dataset method and do not call the <i>association</i> method
871
+ directly or indirectly.
872
+
865
873
  == Association Options
866
874
 
867
875
  Sequel's associations mostly share the same options. For ease of understanding,
868
876
  they are grouped here by section.
869
877
 
870
878
  The defaults for any of these options can be set at the class level using
871
- <tt>Sequel::Model.default_association_options</tt>. Many of these options
872
- are specific to particular associations and probably should not be set as
873
- defaults, but there certainly are options where a class level default makes
874
- sense.
879
+ <tt>Sequel::Model.default_association_options</tt>. To make
880
+ associations read only by default:
881
+
882
+ Sequel::Model.default_association_options[:read_only] = true
883
+
884
+ Many of these options are specific to particular association types, and
885
+ the defaults can be set on a per association type basis. To make one_to_many
886
+ associations read only by default:
887
+
888
+ Sequel::Model.default_association_type_options[:one_to_many] = {read_only: true}
875
889
 
876
890
  === Association Dataset Modification Options
877
891
 
@@ -883,7 +897,7 @@ use for the association. For example, if you wanted an association
883
897
  that returns all albums of an artist that went gold (sold at least
884
898
  500,000 copies):
885
899
 
886
- Artist.one_to_many :gold_albums, :class=>:Album do |ds|
900
+ Artist.one_to_many :gold_albums, class: :Album do |ds|
887
901
  ds.where{copies_sold > 500000}
888
902
  end
889
903
 
@@ -891,7 +905,7 @@ The result of the block is cached as an optimization. One of the side
891
905
  effects of that is that if your block depends on external state, it won't
892
906
  work correctly unless you setup a delayed evaluation. For example:
893
907
 
894
- Artist.one_to_many :gold_albums, :class=>:Album do |ds|
908
+ Artist.one_to_many :gold_albums, class: :Album do |ds|
895
909
  ds.where{copies_sold > $gold_limit}
896
910
  end
897
911
 
@@ -899,7 +913,7 @@ In this case if you change <tt>$gold_limit</tt> later, the changes won't
899
913
  effect the association. If you want to pick up changes to <tt>$gold_limit</tt>,
900
914
  you need to setup a delayed evaluation:
901
915
 
902
- Artist.one_to_many :gold_albums, :class=>:Album do |ds|
916
+ Artist.one_to_many :gold_albums, class: :Album do |ds|
903
917
  ds.where{copies_sold > Sequel.delay{$gold_limit}}
904
918
  end
905
919
 
@@ -908,7 +922,7 @@ you need to setup a delayed evaluation:
908
922
  This is the class of the associated objects that will be used. It's
909
923
  one of the most commonly used options. If it is not given, it guesses
910
924
  based on the name of the association, including considering the namespace
911
- of the current model. If a *_to_many association is used, uses the
925
+ of the current model. If a *_to_many association is used, this uses the
912
926
  singular form of the association name. For example:
913
927
 
914
928
  Album.many_to_one :artist # guesses Artist
@@ -927,44 +941,47 @@ default class guessed will be wrong:
927
941
  You can specify the :class option using the class itself, a Symbol,
928
942
  or a String:
929
943
 
930
- Album.many_to_one :artist, :class=>Artist # Class
931
- Album.many_to_one :artist, :class=>:Artist # Symbol
932
- Album.many_to_one :artist, :class=>"Artist" # String
944
+ Album.many_to_one :artist, class: Artist # Class
945
+ Album.many_to_one :artist, class: :Artist # Symbol
946
+ Album.many_to_one :artist, class: "Artist" # String
933
947
 
934
948
  If you are namespacing your models, and you need to specify the :class
935
949
  option, the path you give to the :class option should be the full path
936
950
  to the associated class including any namespaces:
937
951
 
938
- Foo::Album.many_to_one :artist # Uses Foo::Artist
939
- Foo::Album.many_to_one :artist, :class=>"Artist" # Uses Artist
940
- Foo::Album.many_to_one :artist, :class=>"Foo::Artist" # Uses Foo::Artist
952
+ Foo::Album.many_to_one :artist # Uses Foo::Artist
953
+ Foo::Album.many_to_one :artist, class: "Artist" # Uses Artist
954
+ Foo::Album.many_to_one :artist, class: "Foo::Artist" # Uses Foo::Artist
941
955
 
942
956
  ==== :key
943
957
 
944
958
  For +many_to_one+ associations, this is the foreign_key in the current model's
945
959
  table that references the associated model's primary key as a symbol.
946
- Defaults to :<i>association</i>_id. Can use an array of symbols for a
947
- composite key association.
960
+ Defaults to :<i>association</i>_id.
948
961
 
949
- Album.many_to_one :artist # :key=>:artist_id
962
+ Album.many_to_one :artist, key: :artistid
950
963
 
951
964
  For +one_to_one+ and +one_to_many+ associations, is the foreign key in
952
965
  associated model's table that references current model's primary key, as a
953
966
  symbol. Defaults to :"#{self.name.underscore}_id".
954
967
 
955
- Artist.one_to_many :albums # :key=>:artist_id
968
+ Artist.one_to_many :albums, key: :artistid
956
969
 
957
970
  In both cases an array of symbols can be used for a composite key association:
958
971
 
959
- Apartment.many_to_one :building # :key=>[:city, :address]
972
+ Apartment.many_to_one :building, key: [:city, :address]
960
973
 
961
974
  ==== :conditions
962
975
 
963
976
  The conditions to use to filter the association, can be any argument passed to +where+.
964
977
  If you use a hash or an array of two element arrays, this will also be used as a
965
- filter when using eager_graph to load the association.
978
+ filter when using eager_graph or association_join to load the association.
966
979
 
967
- Artist.one_to_many :good_albums, :class=>:Album, :conditions=>{:good=>true}
980
+ If you do not use a hash or array of two element arrays, you should use the
981
+ :graph_conditions, :graph_only_conditions, or :graph_block option or you will not
982
+ be able to use eager_graph or association_join with the association.
983
+
984
+ Artist.one_to_many :good_albums, class: :Album, conditions: {:good=>true}
968
985
  @artist.good_albums
969
986
  # SELECT * FROM albums WHERE ((artist_id = 1) AND (good IS TRUE))
970
987
 
@@ -973,10 +990,8 @@ filter when using eager_graph to load the association.
973
990
  The column(s) by which to order the association dataset. Can be a
974
991
  singular column or an array.
975
992
 
976
- Artist.one_to_many :albums_by_name, :class=>:Album,
977
- :order=>:name
978
- Artist.one_to_many :albums_by_num_tracks, :class=>:Album,
979
- :order=>[:num_tracks, :name]
993
+ Artist.one_to_many :albums_by_name, class: :Album, order: :name
994
+ Artist.one_to_many :albums_by_num_tracks, class: :Album, order: [:num_tracks, :name]
980
995
 
981
996
  ==== :select
982
997
 
@@ -992,20 +1007,19 @@ can clash with columns from the associated table, so you should alias any
992
1007
  columns that have the same name in both the join table and the associated
993
1008
  table. Example:
994
1009
 
995
- Artist.one_to_many :albums, :select=>[:id, :name]
996
- Album.many_to_many :tags, :select=>[Sequel.expr(:tags).*, :albums_tags__number]
1010
+ Artist.one_to_many :albums, select: [:id, :name]
1011
+ Album.many_to_many :tags, select: [Sequel[:tags].*, Sequel[:albums_tags][:number]]
997
1012
 
998
1013
  ==== :limit
999
1014
 
1000
1015
  Limit the number of records to the provided value:
1001
1016
 
1002
- Artist.one_to_many :best_selling_albums, :class=>:Album,
1003
- :order=>:copies_sold, :limit=>5 # LIMIT 5
1017
+ Artist.one_to_many :best_selling_albums, class: :Album, order: :copies_sold, limit: 5
1004
1018
 
1005
1019
  Use an array with two arguments for the value to specify a limit and an offset.
1006
1020
 
1007
- Artist.one_to_many :next_best_selling_albums, :class=>:Album,
1008
- :order=>:copies_sold, :limit=>[10, 5] # LIMIT 10 OFFSET 5
1021
+ Artist.one_to_many :next_best_selling_albums, class: :Album, order: :copies_sold, limit: [10, 5]
1022
+ # LIMIT 10 OFFSET 5
1009
1023
 
1010
1024
  This probably doesn't make a lot of sense for *_to_one associations, though you
1011
1025
  could use it to specify an offset.
@@ -1017,16 +1031,16 @@ associated model, as a symbol. Defaults to the name of current model and name
1017
1031
  of associated model, pluralized, underscored, sorted, and joined with '_'.
1018
1032
  Here's an example of the defaults:
1019
1033
 
1020
- Artist.many_to_many :albums # :join_table=>:albums_artists
1021
- Album.many_to_many :artists # :join_table=>:albums_artists
1022
- Person.many_to_many :colleges # :join_table=>:colleges_people
1034
+ Artist.many_to_many :albums, join_table: :albums_artists
1035
+ Album.many_to_many :artists, join_table: :albums_artists
1036
+ Person.many_to_many :colleges, join_table: :colleges_people
1023
1037
 
1024
1038
  ==== :left_key [+many_to_many+, +one_through_one+]
1025
1039
 
1026
1040
  Foreign key in join table that points to current model's primary key, as a
1027
1041
  symbol. Defaults to :"#{model_name.underscore}_id".
1028
1042
 
1029
- Album.many_to_many :tags # :left_key=>:album_id
1043
+ Album.many_to_many :tags, left_key: :album_id
1030
1044
 
1031
1045
  Can use an array of symbols for a composite key association.
1032
1046
 
@@ -1036,7 +1050,7 @@ Foreign key in join table that points to associated model's primary key, as a
1036
1050
  symbol. Defaults to :"#{association_name.singularize}_id" for +many_to_many+
1037
1051
  and :"#{association_name}_id" for +one_through_one+.
1038
1052
 
1039
- Album.many_to_many :tags # :right_key=>:tag_id
1053
+ Album.many_to_many :tags, right_key: :tag_id
1040
1054
 
1041
1055
  Can use an array of symbols for a composite key association.
1042
1056
 
@@ -1062,10 +1076,10 @@ into the cloned options.
1062
1076
  This is commonly used if you have a bunch of similar associations that
1063
1077
  you want to DRY up:
1064
1078
 
1065
- one_to_many :english_verses, :class=>:LyricVerse, :key=>:lyricsongid,
1066
- :order=>:number, :conditions=>{:languageid=>1}
1067
- one_to_many :romaji_verses, :clone=>:english_verses, :conditions=>{:languageid=>2}
1068
- one_to_many :japanese_verses, :clone=>:english_verses, :conditions=>{:languageid=>3}
1079
+ one_to_many :english_verses, class: :LyricVerse, key: :lyricsongid,
1080
+ order: :number, conditions: {languageid: 1}
1081
+ one_to_many :romaji_verses, clone: :english_verses, conditions: {languageid: 2}
1082
+ one_to_many :japanese_verses, clone: :english_verses, conditions: {languageid: 3}
1069
1083
 
1070
1084
  Note that for the final two asociations, you didn't have to specify the :class,
1071
1085
  :key, or :order options, as they were copied by the :clone option. By specifying
@@ -1074,8 +1088,8 @@ option of the first association, it doesn't attempt to merge them.
1074
1088
 
1075
1089
  In addition to the options hash, the :clone option will copy a block argument
1076
1090
  from the existing situation. If you want a cloned association to not have the
1077
- same block as the association you are cloning from, specify the :block=>nil option
1078
- in additon to the :clone option.
1091
+ same block as the association you are cloning from, specify the block: nil option
1092
+ in addition to the :clone option.
1079
1093
 
1080
1094
  ==== :dataset
1081
1095
 
@@ -1093,16 +1107,14 @@ already applied, and the proc should return a modified copy of this dataset.
1093
1107
  Here's an example of an association of songs to artists through lyrics, where
1094
1108
  the artist can perform any one of four tasks for the lyric:
1095
1109
 
1096
- Album.one_to_many :songs, :dataset=>(proc do |r|
1110
+ Artist.one_to_many :songs, dataset: (lambda do |r|
1097
1111
  r.associated_dataset.select_all(:songs).
1098
- join(Lyric, :id=>:lyricid,
1099
- id=>[:composer_id, :arranger_id, :vocalist_id, :lyricist_id])
1112
+ join(:lyrics, id: :lyricid, id=>[:composer_id, :arranger_id, :vocalist_id, :lyricist_id])
1100
1113
  end)
1101
1114
  Artist.first.songs_dataset
1102
1115
  # SELECT songs.* FROM songs
1103
- # INNER JOIN lyrics ON
1104
- # lyrics.id = songs.lyric_id AND
1105
- # 1 IN (composer_id, arranger_id, vocalist_id, lyricist_id)
1116
+ # INNER JOIN lyrics ON ((lyrics.id = songs.lyric_id)
1117
+ # AND (1 IN (composer_id, arranger_id, vocalist_id, lyricist_id))
1106
1118
 
1107
1119
  ==== :extend
1108
1120
 
@@ -1119,8 +1131,8 @@ it defaults to the primary key of the table. Can use an
1119
1131
  array of symbols for a composite key association.
1120
1132
 
1121
1133
  Artist.set_primary_key :arid
1122
- Artist.one_to_many :albums # :primary_key=>:arid
1123
- Album.one_to_many :artist # :primary_key=>:arid
1134
+ Artist.one_to_many :albums, primary_key: :arid
1135
+ Album.one_to_many :artist, primary_key: :arid
1124
1136
 
1125
1137
  ==== :left_primary_key [+many_to_many+, +one_through_one+]
1126
1138
 
@@ -1128,7 +1140,7 @@ Column in current table that :left_key option points to, as a symbol.
1128
1140
  Defaults to primary key of current table.
1129
1141
 
1130
1142
  Album.set_primary_key :alid
1131
- Album.many_to_many :tags # :left_primary_key=>:alid
1143
+ Album.many_to_many :tags, left_primary_key: :alid
1132
1144
 
1133
1145
  Can use an array of symbols for a composite key association.
1134
1146
 
@@ -1138,7 +1150,7 @@ Column in associated table that :right_key points to, as a symbol.
1138
1150
  Defaults to primary key of the associated table.
1139
1151
 
1140
1152
  Tag.set_primary_key :tid
1141
- Album.many_to_many :tags # :right_primary_key=>:tid
1153
+ Album.many_to_many :tags, right_primary_key: :tid
1142
1154
 
1143
1155
  Can use an array of symbols for a composite key association.
1144
1156
 
@@ -1150,9 +1162,26 @@ join of the join table and the associated table, whereas this option just
1150
1162
  applies to the join table. It can be used to make sure that filters are used
1151
1163
  when deleting.
1152
1164
 
1153
- Artist.many_to_many :lead_guitar_albums, :join_table_block=>proc do |ds|
1154
- ds.where(:instrument_id=>5)
1155
- end
1165
+ Artist.many_to_many :lead_guitar_albums, class: :Album, :join_table_block=>(lambda do |ds|
1166
+ ds.where(instrument_id: 5)
1167
+ end)
1168
+
1169
+ ==== :join_table_db [+many_to_many+, +one_through_one+]
1170
+
1171
+ A Sequel::Database to use for the join table. Specifying this option switches the
1172
+ loading to use a separate query for the join table. This is useful if the
1173
+ join table is not located in the same database as the associated table, or
1174
+ if the database account with access to the associated table doesn't have
1175
+ access to the join table.
1176
+
1177
+ For example, if the Album class uses a different Sequel::Database than the Artist
1178
+ class, and the join table is in the database that the Artist class uses:
1179
+
1180
+ Artist.many_to_many :lead_guitar_albums, class: :Album, :join_table_db=>Artist.db
1181
+
1182
+ This option also affects the add/remove/remove_all methods, by changing
1183
+ which database is used for inserts/deletes from the join table (add/remove/remove_all
1184
+ defaults to use the current model's database instead of the associated model's database).
1156
1185
 
1157
1186
  === Callback Options
1158
1187
 
@@ -1162,14 +1191,10 @@ that are called with the associated object. Procs are called with the receiver
1162
1191
  as the first argument and the associated object as the second argument. If
1163
1192
  an array is given, all of them are called in order.
1164
1193
 
1165
- Before callbacks are often used to check preconditions, they can return
1166
- false to signal Sequel to abort the modification. If any before callback
1167
- returns false, the remaining before callbacks are not called and modification
1168
- is aborted. Before callbacks are also commonly used to modify the current
1169
- object or the associated object.
1170
-
1171
- After callbacks are often used for notification (logging, email) after a
1172
- successful modification has been made.
1194
+ Before callbacks are often used to check preconditions, they can call Model#cancel_action
1195
+ to signal Sequel to abort the modification. If any before callback
1196
+ calls cancel_action, the remaining before callbacks are not called and the modification
1197
+ is aborted.
1173
1198
 
1174
1199
  ==== :before_add [+one_to_many+, +many_to_many+]
1175
1200
 
@@ -1177,7 +1202,7 @@ Called before adding an object to the association:
1177
1202
 
1178
1203
  class Artist
1179
1204
  # Don't allow adding an album to an artist if it has no tracks
1180
- one_to_many :albums, :before_add=>proc{|ar, al| false if al.num_tracks == 0}
1205
+ one_to_many :albums, before_add: lambda{|ar, al| ar.cancel_action if al.num_tracks == 0}
1181
1206
  end
1182
1207
 
1183
1208
  ==== :after_add [+one_to_many+, +many_to_many+]
@@ -1186,12 +1211,12 @@ Called after adding an object to the association:
1186
1211
 
1187
1212
  class Artist
1188
1213
  # Log all associations of albums to an audit logging table
1189
- one_to_many :albums, :after_add=>:log_add_album
1214
+ one_to_many :albums, after_add: :log_add_album
1190
1215
 
1191
1216
  private
1192
1217
 
1193
1218
  def log_add_album(album)
1194
- DB[:audit_logs].insert(:log=>"Album #{album.inspect} associated to #{inspect}")
1219
+ DB[:audit_logs].insert(log: "Album #{album.inspect} associated to #{inspect}")
1195
1220
  end
1196
1221
  end
1197
1222
 
@@ -1201,7 +1226,7 @@ Called before removing an object from the association using <tt>remove_<i>associ
1201
1226
 
1202
1227
  class Artist
1203
1228
  # Don't allow removing a self-titled album
1204
- one_to_many :albums, :before_remove=>proc{|ar, al| false if al.name == ar.name}
1229
+ one_to_many :albums, before_remove: lambda{|ar, al| ar.cancel_action if al.name == ar.name}
1205
1230
  end
1206
1231
 
1207
1232
  This is not called when using <tt>remove_all_<i>association</i></tt>.
@@ -1212,12 +1237,12 @@ Called after removing an object from the association using <tt>remove_<i>associa
1212
1237
 
1213
1238
  class Artist
1214
1239
  # Log all disassociations of albums to an audit logging table
1215
- one_to_many :albums, :after_remove=>:log_remove_album
1240
+ one_to_many :albums, after_remove: :log_remove_album
1216
1241
 
1217
1242
  private
1218
1243
 
1219
1244
  def log_remove_album(album)
1220
- DB[:audit_logs].insert(:log=>"Album #{album.inspect} disassociated from #{inspect}")
1245
+ DB[:audit_logs].insert(log: "Album #{album.inspect} disassociated from #{inspect}")
1221
1246
  end
1222
1247
  end
1223
1248
 
@@ -1230,7 +1255,7 @@ Called before the _<i>association</i>= method is called to modify the objects:
1230
1255
  class Album
1231
1256
  # Don't associate the album with an artist if the year the album was
1232
1257
  # released is less than the year the artist/band started.
1233
- many_to_one :artist, :before_set=>proc{|al, ar| false if al.year < ar.year_started}
1258
+ many_to_one :artist, before_set: lambda{|al, ar| al.cancel_action if al.year < ar.year_started}
1234
1259
  end
1235
1260
 
1236
1261
  ==== :after_set [+many_to_one+, +one_to_one+]
@@ -1239,12 +1264,12 @@ Called after the _<i>association</i>= method is called to modify the objects:
1239
1264
 
1240
1265
  class Album
1241
1266
  # Log all disassociations of albums to an audit logging table
1242
- many_to_one :artist, :after_set=>:log_artist_set
1267
+ many_to_one :artist, after_set: :log_artist_set
1243
1268
 
1244
1269
  private
1245
1270
 
1246
1271
  def log_artist_set(artist)
1247
- DB[:audit_logs].insert(:log=>"Artist for album #{inspect} set to #{artist.inspect}")
1272
+ DB[:audit_logs].insert(log: "Artist for album #{inspect} set to #{artist.inspect}")
1248
1273
  end
1249
1274
  end
1250
1275
 
@@ -1253,16 +1278,15 @@ Called after the _<i>association</i>= method is called to modify the objects:
1253
1278
  Called after retrieving the associated records from the database.
1254
1279
 
1255
1280
  class Artist
1256
- # Cache all album names to a single string when retrieving the
1257
- # albums.
1258
- one_to_many :albums, :after_load=>:cache_album_names
1281
+ # Cache all album names to a single string when retrieving the albums.
1282
+ one_to_many :albums, after_load: :cache_album_names
1259
1283
 
1260
1284
  attr_reader :album_names
1261
1285
 
1262
1286
  private
1263
1287
 
1264
1288
  def cache_album_names(albums)
1265
- @album_names = albums.map{|x| x.name}.join(", ")
1289
+ @album_names = albums.map(&:name).join(", ")
1266
1290
  end
1267
1291
  end
1268
1292
 
@@ -1290,17 +1314,17 @@ For example, if you know that any time that you want to load an artist's
1290
1314
  albums, you are also going to want access to the album's tracks as well:
1291
1315
 
1292
1316
  # Eager load tracks when loading the albums
1293
- Artist.one_to_many :albums, :eager=>:tracks
1317
+ Artist.one_to_many :albums, eager: :tracks
1294
1318
 
1295
1319
  You can also use a hash or array to specify multiple dependent associations
1296
1320
  to eagerly load:
1297
1321
 
1298
1322
  # Eager load the albums' tracks and the tracks' tags when loading the albums
1299
- Artist.one_to_many :albums, :eager=>{:tracks=>:tags}
1323
+ Artist.one_to_many :albums, eager: {tracks: :tags}
1300
1324
  # Eager load the albums' tags and tracks when loading the albums
1301
- Artist.one_to_many :albums, :eager=>[:tags, :tracks]
1325
+ Artist.one_to_many :albums, eager: [:tags, :tracks]
1302
1326
  # Eager load the albums' tags, tracks, and tracks' tags when loading the albums
1303
- Artist.one_to_many :albums, :eager=>[:tags, {:tracks=>:tags}]
1327
+ Artist.one_to_many :albums, eager: [:tags, {tracks: :tags}]
1304
1328
 
1305
1329
  ==== :eager_loader
1306
1330
 
@@ -1319,7 +1343,7 @@ performance if a custom eager loader does not use the key_hash).
1319
1343
 
1320
1344
  If given, should be a proc to use instead of the association method block
1321
1345
  when eagerly loading. To not use a block when eager loading when one is
1322
- used normally, should to nil. It's very uncommon to need this option.
1346
+ used normally, set to nil. It's very uncommon to need this option.
1323
1347
 
1324
1348
  === Eager Loading via eager_graph (one query with joins) Options
1325
1349
 
@@ -1330,13 +1354,11 @@ object(s). This is useful for example if you always want to eagerly load depende
1330
1354
  associations when loading this association, but you want to filter or order the
1331
1355
  association based on dependent associations:
1332
1356
 
1333
- Artist.one_to_many :albums_with_short_tracks, :class=>:Album,
1334
- :eager_graph=>:tracks do |ds|
1335
- ds.where{tracks__seconds < 120}
1357
+ Artist.one_to_many :albums_with_short_tracks, class: :Album, eager_graph: :tracks do |ds|
1358
+ ds.where{tracks[:seconds] < 120}
1336
1359
  end
1337
- Artist.one_to_many :albums_by_track_name, :class=>:Album,
1338
- :eager_graph=>:tracks do |ds|
1339
- ds.order(:tracks__name)
1360
+ Artist.one_to_many :albums_by_track_name, class: :Album, eager_graph: :tracks do |ds|
1361
+ ds.order{tracks[:name]}
1340
1362
  end
1341
1363
 
1342
1364
  You can also use a hash or array of arguments for :eager_graph, similar to
@@ -1349,8 +1371,7 @@ association via eager_graph. Should be a hash or an array of two element
1349
1371
  arrays. If not specified, the :conditions option is used if it is a hash or
1350
1372
  array of two element arrays.
1351
1373
 
1352
- Artist.one_to_many :active_albums, :class=>:Album,
1353
- :graph_conditions=>{:active=>true}
1374
+ Artist.one_to_many :active_albums, class: :Album, graph_conditions: {active: true}
1354
1375
 
1355
1376
  Note that these conditions on the association are in addition to the default
1356
1377
  conditions specified by the foreign/primary keys. If you want to replace
@@ -1363,8 +1384,8 @@ The block to pass to Dataset#join_table when eagerly loading the association
1363
1384
  via eager_graph. This is useful to specify conditions that can't be specified
1364
1385
  in a hash or array of two element arrays.
1365
1386
 
1366
- Artist.one_to_many :gold_albums, :class=>:Album,
1367
- :graph_block=>proc{|j,lj,js| Sequel.qualify(j, :copies_sold) > 500000}
1387
+ Artist.one_to_many :gold_albums, class: :Album,
1388
+ graph_block: proc{|j,lj,js| Sequel[j][:copies_sold] > 500000}
1368
1389
 
1369
1390
  ==== :graph_join_type
1370
1391
 
@@ -1372,7 +1393,7 @@ The type of SQL join to use when eagerly loading the association via
1372
1393
  eager_graph. Defaults to :left_outer. This is useful if you want to
1373
1394
  ensure that only artists that have albums are returned:
1374
1395
 
1375
- Artist.one_to_many :albums, :graph_join_type=>:inner
1396
+ Artist.one_to_many :albums, graph_join_type: :inner
1376
1397
  # Will exclude artists without an album
1377
1398
  Artist.eager_graph(:albums).all
1378
1399
 
@@ -1394,10 +1415,11 @@ that the album was associated to the artist by name. However, you weren't
1394
1415
  enforcing case sensitivity between the keys, so you still want to return albums
1395
1416
  where the artist's name differs in case:
1396
1417
 
1397
- Artist.one_to_many :albums, :key=>:artist_name,
1398
- :graph_only_conditions=>nil,
1399
- :graph_block=>proc{|j,lj,js| {Sequel.function(:lower, Sequel.qualify(j, :artist_name))=>
1400
- Sequel.function(:lower, Sequel.qualify(lj, :name))}}
1418
+ Artist.one_to_many :albums, key: :artist_name,
1419
+ graph_only_conditions: nil,
1420
+ graph_block: (proc do |j,lj,js|
1421
+ {Sequel.function(:lower, Sequel[j][:artist_name])=> Sequel.function(:lower, Sequel[lj][:name])}
1422
+ end)
1401
1423
 
1402
1424
  Note how :graph_only_conditions is set to nil to ignore any existing conditions,
1403
1425
  and :graph_block is used to set up the case insensitive comparison.
@@ -1406,12 +1428,10 @@ Another case where :graph_only_conditions may be used is if you want to use
1406
1428
  a JOIN USING or NATURAL JOIN for the graph:
1407
1429
 
1408
1430
  # JOIN USING
1409
- Artist.one_to_many :albums, :key=>:artist_name,
1410
- :graph_only_conditions=>[:artist_name]
1431
+ Artist.one_to_many :albums, key: :artist_name, graph_only_conditions: [:artist_name]
1411
1432
 
1412
1433
  # NATURAL JOIN
1413
- Artist.one_to_many :albums, :key=>:artist_name,
1414
- :graph_only_conditions=>nil, :graph_join_type=>:natural
1434
+ Artist.one_to_many :albums, key: :artist_name, graph_only_conditions: nil, graph_join_type: :natural
1415
1435
 
1416
1436
  ==== :graph_alias_base
1417
1437
 
@@ -1424,7 +1444,7 @@ This is mostly useful if you have associations with the same name in many models
1424
1444
  to be able to easily tell which table alias corresponds to which association when eagerly
1425
1445
  graphing multiple associations with the same name.
1426
1446
 
1427
- You can override this option on a per-graph basis by specifying the association as an
1447
+ You can override this option on a per-eager_graph basis by specifying the association as an
1428
1448
  SQL::AliasedExpression instead of a symbol:
1429
1449
 
1430
1450
  Album.eager_graph(Sequel.as(:artist, :a))
@@ -1449,10 +1469,10 @@ at least the following keys:
1449
1469
 
1450
1470
  Example:
1451
1471
 
1452
- Artist.one_to_many :self_title_albums, :class=>:Album,
1453
- :eager_grapher=>(proc do |eo|
1454
- eo[:self].graph(Album, {:artist_id=>:id, :name=>:name},
1455
- :table_alias=>eo[:table_alias], :implicit_qualifier=>eo[:implicit_qualifier])
1472
+ Artist.one_to_many :self_title_albums, class: :Album,
1473
+ :eager_grapher=>(lambda do |eo|
1474
+ eo[:self].graph(:albums, {artist_id: :id, name: :name},
1475
+ table_alias: eo[:table_alias], implicit_qualifier: eo[:implicit_qualifier])
1456
1476
  end)
1457
1477
 
1458
1478
  ==== :order_eager_graph
@@ -1483,9 +1503,9 @@ degrees_received that includes a string field specifying the name of the
1483
1503
  degree, and you want to eager load all colleges for people where the person
1484
1504
  has received a specific degree:
1485
1505
 
1486
- Person.many_to_many :bs_degree_colleges, :class=>:College,
1487
- :join_table=>:degrees_received,
1488
- :graph_join_table_conditions=>{:degree=>'BS'}
1506
+ Person.many_to_many :bs_degree_colleges, class: :College,
1507
+ join_table: :degrees_received,
1508
+ graph_join_table_conditions: {degree: 'BS'}
1489
1509
 
1490
1510
  ==== :graph_join_table_block [+many_to_many+, +one_through_one+]
1491
1511
 
@@ -1502,9 +1522,9 @@ degrees_received that includes a string field specifying the name of the
1502
1522
  degree, and you want to eager load all colleges for people where the person
1503
1523
  has received a bachelor's degree (degree starting with B):
1504
1524
 
1505
- Person.many_to_many :bachelor_degree_colleges, :class=>:College,
1506
- :join_table=>:degrees_received,
1507
- :graph_join_table_block=>proc{|j,lj,js| Sequel.qualify(j, :degree).like('B%')}
1525
+ Person.many_to_many :bachelor_degree_colleges, class: :College,
1526
+ join_table: :degrees_received,
1527
+ graph_join_table_block: proc{|j,lj,js| Sequel[j][:degree].like('B%')}
1508
1528
 
1509
1529
  This should be done when graphing the join table, instead of when graphing the
1510
1530
  final table, as :degree is a column of the join table.
@@ -1531,7 +1551,7 @@ would use when eagerly graphing.
1531
1551
  Sequel's associations can work not just with columns, but also with
1532
1552
  arbitrary SQL expressions. For example, on PostgreSQL, you can store
1533
1553
  foreign keys to other tables in hstore, json, or jsonb columns, and Sequel
1534
- can automatically work with such constructs, including full support for
1554
+ can work with such constructs, including full support for
1535
1555
  eager loading.
1536
1556
 
1537
1557
  There's actually two parts to supporting associations based on SQL
@@ -1544,7 +1564,7 @@ to a model instance, but needs to use the SQL expression in a query,
1544
1564
  it will use the SQL expression object.
1545
1565
 
1546
1566
  Below is an example storing foreign keys to other tables in a
1547
- PostgreSQL hstore column, using the +pg_hstore+ and +pg_hstore_ops+
1567
+ PostgreSQL hstore column, using the +pg_json+ and +pg_json_ops+
1548
1568
  extensions.
1549
1569
 
1550
1570
  # Example schema:
@@ -1553,14 +1573,14 @@ extensions.
1553
1573
  # :meta ---/ :name
1554
1574
  # :name
1555
1575
  class Album < Sequel::Model
1556
- many_to_one :artist, :key_column=>Sequel.cast(Sequel.hstore(:meta)['artist_id'], Integer)
1576
+ many_to_one :artist, key_column: Sequel.pg_jsonb(:meta)['artist_id'].cast(String).cast(Integer)
1557
1577
 
1558
1578
  def artist_id
1559
1579
  meta['artist_id'].to_i
1560
1580
  end
1561
1581
  end
1562
1582
  class Artist < Sequel::Model
1563
- one_to_many :albums, :key=>Sequel.cast(Sequel.hstore(:meta)['artist_id'], Integer), :key_method=>:artist_id
1583
+ one_to_many :albums, key: Sequel.pg_jsonb(:meta)['artist_id'].cast(String).cast(Integer), key_method: :artist_id
1564
1584
  end
1565
1585
 
1566
1586
  # Example schema:
@@ -1568,12 +1588,12 @@ extensions.
1568
1588
  # :id <----- :meta -------> :id
1569
1589
  # :name :name
1570
1590
  class Album < Sequel::Model
1571
- many_to_many :artists, :left_key=>Sequel.cast(Sequel.hstore(:meta)['album_id'], Integer),
1572
- :right_key=>Sequel.cast(Sequel.hstore(:meta)['artist_id'], Integer)
1591
+ many_to_many :artists, left_key: Sequel.pg_jsonb(:meta)['album_id'].cast(String).cast(Integer),
1592
+ right_key: Sequel.pg_jsonb(:meta)['artist_id'].cast(String).cast(Integer)
1573
1593
  end
1574
1594
  class Artist < Sequel::Model
1575
- many_to_many :albums, :left_key=>Sequel.cast(Sequel.hstore(:meta)['artist_id'], Integer),
1576
- :right_key=>Sequel.cast(Sequel.hstore(:meta)['album_id'], Integer)
1595
+ many_to_many :albums, left_key: Sequel.pg_jsonb(:meta)['artist_id'].cast(String).cast(Integer),
1596
+ right_key: Sequel.pg_jsonb(:meta)['album_id'].cast(String).cast(Integer)
1577
1597
  end
1578
1598
 
1579
1599
  ==== :key_column [+many_to_one+]
@@ -1606,62 +1626,6 @@ Like the :left_primary_key option, but :left_primary_key references the method n
1606
1626
  Like the :right_primary_key option, but :right_primary_key references the column/expression
1607
1627
  name, while :right_primary_key_method references the method name.
1608
1628
 
1609
- === Private Method Overriding Options
1610
-
1611
- These options override the private methods that Sequel defines to do
1612
- the actual work of associating and deassociating objects.
1613
-
1614
- ==== :setter [*_to_one associations]
1615
-
1616
- This overrides the default behavior when you call an association setter
1617
- method. Let's say you want to set a specific field whenever associating an object
1618
- using the association setter method.
1619
-
1620
- class Album < Sequel::Model
1621
- many_to_one :artist, :setter=>(proc do |artist|
1622
- if artist
1623
- self.artist_id = artist.id
1624
- self.file_under = "#{artist.name}-#{name}"
1625
- else
1626
- self.artist_id = nil
1627
- self.file_under = name
1628
- end
1629
- end)
1630
- end
1631
-
1632
- ==== :adder [*_to_many associations]
1633
-
1634
- Continuing with the same example, here's how you would handle the same case if
1635
- you also wanted to handle the Artist#add_album method:
1636
-
1637
- class Artist < Sequel::Model
1638
- one_to_many :albums, :adder=>(proc do |album|
1639
- album.update(:artist_id => id, :file_under=>"#{name}-#{album.name}")
1640
- end)
1641
- end
1642
-
1643
- ==== :remover [*_to_many associations]
1644
-
1645
- Continuing with the same example, here's how you would handle the same case if
1646
- you also wanted to handle the Artist#remove_album method:
1647
-
1648
- class Artist < Sequel::Model
1649
- one_to_many :albums, :remover=>(proc do |album|
1650
- album.update(:artist_id => nil, :file_under=>album.name)
1651
- end)
1652
- end
1653
-
1654
- ==== :clearer [*_to_many associations]
1655
-
1656
- Continuing with the same example, here's how you would handle the same case if
1657
- you also wanted to handle the Artist#remove_all_albums method:
1658
-
1659
- class Artist < Sequel::Model
1660
- one_to_many :albums, :clearer=>(proc do
1661
- albums_dataset.update(:artist_id => nil, :file_under=>:name)
1662
- end)
1663
- end
1664
-
1665
1629
  === Advanced Options
1666
1630
 
1667
1631
  ==== :reciprocal
@@ -1673,7 +1637,7 @@ Set to nil to not use a reciprocal.
1673
1637
 
1674
1638
  Reciprocals are used in Sequel to modify the matching cached associations
1675
1639
  in associated objects when calling association methods on the current object.
1676
- For example, when you retrieve objects in a one_to_many association, it'll
1640
+ For example, when you retrieve objects in a one_to_many association, Sequel will
1677
1641
  automatically set the matching many_to_one association in the associated
1678
1642
  objects. The result of this is that code that does this:
1679
1643
 
@@ -1711,9 +1675,8 @@ For +many_to_one+ and +one_to_one+ associations, do not add a setter method.
1711
1675
  For +one_to_many+ and +many_to_many+, do not add the add_<i>association</i>,
1712
1676
  remove_<i>association</i>, or remove_all_<i>association</i> methods.
1713
1677
 
1714
- If the default modification methods would not do what you want, and you
1715
- don't plan on overriding the internal modification methods to do what you
1716
- want, it may be best to set this option to true.
1678
+ If you are not using the association modification methods, setting this
1679
+ value to true will save memory.
1717
1680
 
1718
1681
  ==== :validate
1719
1682
 
@@ -1729,7 +1692,7 @@ the validate option should be set to false.
1729
1692
  Set to false to not raise an exception when validation or a before hook
1730
1693
  fails when implicitly saving an associated object in the add_* or remove_*
1731
1694
  methods. This mirrors the raise_on_save_failure model setting, which these
1732
- methods do not respect (by design, since the setting is dangerous).
1695
+ methods do not respect (by design).
1733
1696
 
1734
1697
  If you use this option, you must explicitly check all add_* and remove_* return
1735
1698
  values to see if they were successful.
@@ -1739,21 +1702,49 @@ values to see if they were successful.
1739
1702
  If set to false, you cannot load the association eagerly via eager or
1740
1703
  eager_graph.
1741
1704
 
1742
- Artist.one_to_many :albums, :allow_eager=>false
1743
- Artist.eager(:albums) # Raises Sequel::Error
1705
+ Artist.one_to_many :albums, allow_eager: false
1706
+ Artist.eager(:albums) # Raises Sequel::Error
1707
+ Artist.eager_graph(:albums) # Raises Sequel::Error
1744
1708
 
1745
1709
  This is usually used if the association dataset depends on specific values in
1746
1710
  model instance that would not be valid when eager loading for multiple
1747
1711
  instances.
1748
1712
 
1713
+ ==== :allow_eager_graph
1714
+
1715
+ If set to false, you cannot load the association eagerly via eager_graph.
1716
+
1717
+ Artist.one_to_many :albums, allow_eager_graph: false
1718
+ Artist.eager(:albums) # Allowed
1719
+ Artist.eager_graph(:albums) # Raises Sequel::Error
1720
+
1721
+ This is useful if you still want to allow loading via eager, but do not want
1722
+ to allow loading via eager graph, possibly because the association does not
1723
+ support joins.
1724
+
1725
+ ==== :allow_filtering_by
1726
+
1727
+ If set to false, you cannot use the association when filtering.
1728
+
1729
+ Artist.one_to_many :albums, allow_filtering_by: false
1730
+ Artist.where(:albums=>Album.where(:name=>'A')).all # Raises Sequel::Error
1731
+
1732
+ This is useful if such filtering cannot work, such as when a subquery cannot
1733
+ be used because the necessary tables are not in the same database.
1734
+
1749
1735
  ==== :instance_specific
1750
1736
 
1751
1737
  This allows you to override the setting of whether the dataset contains instance
1752
- specific code. For example, if you are passing a block to the association,
1738
+ specific code. If you are passing a block to the association,
1753
1739
  Sequel sets this to true by default, which disables some optimizations that
1754
1740
  would be invalid if the association is instance specific. If you know that the
1755
1741
  block does not contain instance specific code, you can set this to false to
1756
- reenable the optimizations.
1742
+ reenable the optimizations. Instance specific code is mostly commonly calling
1743
+ model instance methods inside an association block, but also
1744
+ includes cases where the association block can return different values based
1745
+ on the runtime environment, such as calls to <tt>Time.now</tt> in the block.
1746
+ Associations that use the :dataset option are always considered instance specific,
1747
+ even if explicitly specified otherwise.
1757
1748
 
1758
1749
  ==== :cartesian_product_number
1759
1750
 
@@ -1775,18 +1766,18 @@ in which to look up the class. If the :class option is not specified as a
1775
1766
  symbol or string, this option is ignored. This namespace can be overridden
1776
1767
  by starting the string or symbol with <tt>::</tt>:
1777
1768
 
1778
- Foo::Album.many_to_one :artist, :class=>"Artist" # Uses Artist
1779
- Foo::Album.many_to_one :artist, :class=>"Artist", :class_namespace=>'Foo' # Uses Foo::Artist
1780
- Foo::Album.many_to_one :artist, :class=>"Foo::Artist", :class_namespace=>'Foo' # Uses Foo::Foo::Artist
1781
- Foo::Album.many_to_one :artist, :class=>"::Artist", :class_namespace=>'Foo' # Uses Artist
1782
- Foo::Album.many_to_one :artist, :class=>"::Foo::Artist", :class_namespace=>'Foo' # Uses Foo::Artist
1769
+ Foo::Album.many_to_one :artist, class: "Artist" # Uses Artist
1770
+ Foo::Album.many_to_one :artist, class: "Artist", class_namespace: 'Foo' # Uses Foo::Artist
1771
+ Foo::Album.many_to_one :artist, class: "Foo::Artist", class_namespace: 'Foo' # Uses Foo::Foo::Artist
1772
+ Foo::Album.many_to_one :artist, class: "::Artist", class_namespace: 'Foo' # Uses Artist
1773
+ Foo::Album.many_to_one :artist, class: "::Foo::Artist", class_namespace: 'Foo' # Uses Foo::Artist
1783
1774
 
1784
1775
  ==== :methods_module
1785
1776
 
1786
1777
  The module that the methods created by the association will be placed
1787
- into. Defaults to the module containing the model's columns. This
1788
- is not included in the model's class, so you are responsible for doing
1789
- that manually.
1778
+ into. Defaults to the module containing the model's columns. Any module
1779
+ given to this option is not included in the model's class automatically,
1780
+ so you are responsible for doing that manually.
1790
1781
 
1791
1782
  This is only useful in rare cases, such as when a plugin that adds
1792
1783
  associations depends on another plugin that defines instance methods of
@@ -1830,4 +1821,3 @@ Sequel will choose either a :distinct_on, :window_function, or
1830
1821
  :correlated_subquery strategy based on the association type and what
1831
1822
  the database supports, but you can override that if necessary using
1832
1823
  this option.
1833
-