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.
- checksums.yaml +5 -5
- data/CHANGELOG +548 -5749
- data/MIT-LICENSE +1 -1
- data/README.rdoc +265 -159
- data/bin/sequel +34 -12
- data/doc/advanced_associations.rdoc +228 -187
- data/doc/association_basics.rdoc +281 -291
- data/doc/bin_sequel.rdoc +5 -3
- data/doc/cheat_sheet.rdoc +86 -51
- data/doc/code_order.rdoc +25 -19
- data/doc/core_extensions.rdoc +104 -63
- data/doc/dataset_basics.rdoc +12 -21
- data/doc/dataset_filtering.rdoc +99 -86
- data/doc/extensions.rdoc +3 -10
- data/doc/fork_safety.rdoc +84 -0
- data/doc/mass_assignment.rdoc +74 -31
- data/doc/migration.rdoc +59 -51
- data/doc/model_dataset_method_design.rdoc +129 -0
- data/doc/model_hooks.rdoc +15 -25
- data/doc/model_plugins.rdoc +12 -12
- data/doc/mssql_stored_procedures.rdoc +3 -3
- data/doc/object_model.rdoc +58 -68
- data/doc/opening_databases.rdoc +85 -95
- data/doc/postgresql.rdoc +263 -38
- data/doc/prepared_statements.rdoc +29 -24
- data/doc/querying.rdoc +189 -167
- data/doc/reflection.rdoc +5 -6
- data/doc/release_notes/5.0.0.txt +159 -0
- data/doc/release_notes/5.1.0.txt +31 -0
- data/doc/release_notes/5.10.0.txt +84 -0
- data/doc/release_notes/5.11.0.txt +83 -0
- data/doc/release_notes/5.12.0.txt +141 -0
- data/doc/release_notes/5.13.0.txt +27 -0
- data/doc/release_notes/5.14.0.txt +63 -0
- data/doc/release_notes/5.15.0.txt +39 -0
- data/doc/release_notes/5.16.0.txt +110 -0
- data/doc/release_notes/5.17.0.txt +31 -0
- data/doc/release_notes/5.18.0.txt +69 -0
- data/doc/release_notes/5.19.0.txt +28 -0
- data/doc/release_notes/5.2.0.txt +33 -0
- data/doc/release_notes/5.20.0.txt +89 -0
- data/doc/release_notes/5.21.0.txt +87 -0
- data/doc/release_notes/5.22.0.txt +48 -0
- data/doc/release_notes/5.23.0.txt +56 -0
- data/doc/release_notes/5.24.0.txt +56 -0
- data/doc/release_notes/5.25.0.txt +32 -0
- data/doc/release_notes/5.26.0.txt +35 -0
- data/doc/release_notes/5.27.0.txt +21 -0
- data/doc/release_notes/5.28.0.txt +16 -0
- data/doc/release_notes/5.29.0.txt +22 -0
- data/doc/release_notes/5.3.0.txt +121 -0
- data/doc/release_notes/5.30.0.txt +20 -0
- data/doc/release_notes/5.31.0.txt +148 -0
- data/doc/release_notes/5.32.0.txt +46 -0
- data/doc/release_notes/5.33.0.txt +24 -0
- data/doc/release_notes/5.34.0.txt +40 -0
- data/doc/release_notes/5.35.0.txt +56 -0
- data/doc/release_notes/5.36.0.txt +60 -0
- data/doc/release_notes/5.37.0.txt +30 -0
- data/doc/release_notes/5.38.0.txt +28 -0
- data/doc/release_notes/5.39.0.txt +19 -0
- data/doc/release_notes/5.4.0.txt +80 -0
- data/doc/release_notes/5.40.0.txt +40 -0
- data/doc/release_notes/5.41.0.txt +25 -0
- data/doc/release_notes/5.42.0.txt +136 -0
- data/doc/release_notes/5.43.0.txt +98 -0
- data/doc/release_notes/5.44.0.txt +32 -0
- data/doc/release_notes/5.45.0.txt +34 -0
- data/doc/release_notes/5.46.0.txt +87 -0
- data/doc/release_notes/5.47.0.txt +59 -0
- data/doc/release_notes/5.48.0.txt +14 -0
- data/doc/release_notes/5.49.0.txt +59 -0
- data/doc/release_notes/5.5.0.txt +61 -0
- data/doc/release_notes/5.50.0.txt +78 -0
- data/doc/release_notes/5.51.0.txt +47 -0
- data/doc/release_notes/5.52.0.txt +87 -0
- data/doc/release_notes/5.53.0.txt +23 -0
- data/doc/release_notes/5.54.0.txt +27 -0
- data/doc/release_notes/5.55.0.txt +21 -0
- data/doc/release_notes/5.56.0.txt +51 -0
- data/doc/release_notes/5.57.0.txt +23 -0
- data/doc/release_notes/5.58.0.txt +31 -0
- data/doc/release_notes/5.59.0.txt +73 -0
- data/doc/release_notes/5.6.0.txt +31 -0
- data/doc/release_notes/5.60.0.txt +22 -0
- data/doc/release_notes/5.61.0.txt +43 -0
- data/doc/release_notes/5.7.0.txt +108 -0
- data/doc/release_notes/5.8.0.txt +170 -0
- data/doc/release_notes/5.9.0.txt +99 -0
- data/doc/schema_modification.rdoc +95 -75
- data/doc/security.rdoc +109 -80
- data/doc/sharding.rdoc +74 -47
- data/doc/sql.rdoc +147 -122
- data/doc/testing.rdoc +43 -20
- data/doc/thread_safety.rdoc +2 -4
- data/doc/transactions.rdoc +97 -18
- data/doc/validations.rdoc +52 -50
- data/doc/virtual_rows.rdoc +90 -109
- data/lib/sequel/adapters/ado/access.rb +15 -17
- data/lib/sequel/adapters/ado/mssql.rb +6 -15
- data/lib/sequel/adapters/ado.rb +150 -20
- data/lib/sequel/adapters/amalgalite.rb +11 -23
- data/lib/sequel/adapters/ibmdb.rb +47 -55
- data/lib/sequel/adapters/jdbc/db2.rb +29 -39
- data/lib/sequel/adapters/jdbc/derby.rb +58 -54
- data/lib/sequel/adapters/jdbc/h2.rb +93 -35
- data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
- data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
- data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
- data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
- data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
- data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
- data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
- data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
- data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
- data/lib/sequel/adapters/jdbc.rb +145 -130
- data/lib/sequel/adapters/mock.rb +100 -111
- data/lib/sequel/adapters/mysql.rb +114 -122
- data/lib/sequel/adapters/mysql2.rb +147 -63
- data/lib/sequel/adapters/odbc/db2.rb +1 -1
- data/lib/sequel/adapters/odbc/mssql.rb +8 -14
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc.rb +20 -25
- data/lib/sequel/adapters/oracle.rb +50 -56
- data/lib/sequel/adapters/postgres.rb +305 -327
- data/lib/sequel/adapters/postgresql.rb +1 -1
- data/lib/sequel/adapters/shared/access.rb +74 -78
- data/lib/sequel/adapters/shared/db2.rb +118 -71
- data/lib/sequel/adapters/shared/mssql.rb +301 -220
- data/lib/sequel/adapters/shared/mysql.rb +299 -217
- data/lib/sequel/adapters/shared/oracle.rb +226 -65
- data/lib/sequel/adapters/shared/postgres.rb +935 -395
- data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
- data/lib/sequel/adapters/shared/sqlite.rb +447 -173
- data/lib/sequel/adapters/sqlanywhere.rb +48 -35
- data/lib/sequel/adapters/sqlite.rb +156 -111
- data/lib/sequel/adapters/tinytds.rb +30 -38
- data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
- data/lib/sequel/adapters/utils/replace.rb +1 -4
- data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
- data/lib/sequel/ast_transformer.rb +17 -89
- data/lib/sequel/connection_pool/sharded_single.rb +18 -15
- data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
- data/lib/sequel/connection_pool/single.rb +18 -13
- data/lib/sequel/connection_pool/threaded.rb +121 -120
- data/lib/sequel/connection_pool.rb +48 -29
- data/lib/sequel/core.rb +351 -301
- data/lib/sequel/database/connecting.rb +69 -57
- data/lib/sequel/database/dataset.rb +13 -5
- data/lib/sequel/database/dataset_defaults.rb +18 -102
- data/lib/sequel/database/features.rb +18 -4
- data/lib/sequel/database/logging.rb +12 -11
- data/lib/sequel/database/misc.rb +180 -122
- data/lib/sequel/database/query.rb +47 -27
- data/lib/sequel/database/schema_generator.rb +178 -84
- data/lib/sequel/database/schema_methods.rb +172 -97
- data/lib/sequel/database/transactions.rb +205 -44
- data/lib/sequel/database.rb +17 -2
- data/lib/sequel/dataset/actions.rb +339 -155
- data/lib/sequel/dataset/dataset_module.rb +46 -0
- data/lib/sequel/dataset/features.rb +90 -35
- data/lib/sequel/dataset/graph.rb +80 -58
- data/lib/sequel/dataset/misc.rb +137 -47
- data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
- data/lib/sequel/dataset/prepared_statements.rb +188 -85
- data/lib/sequel/dataset/query.rb +530 -222
- data/lib/sequel/dataset/sql.rb +590 -368
- data/lib/sequel/dataset.rb +26 -16
- data/lib/sequel/deprecated.rb +12 -2
- data/lib/sequel/exceptions.rb +46 -16
- data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
- data/lib/sequel/extensions/_model_pg_row.rb +43 -0
- data/lib/sequel/extensions/_pretty_table.rb +2 -5
- data/lib/sequel/extensions/any_not_empty.rb +45 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
- data/lib/sequel/extensions/async_thread_pool.rb +438 -0
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/blank.rb +8 -0
- data/lib/sequel/extensions/caller_logging.rb +79 -0
- data/lib/sequel/extensions/columns_introspection.rb +4 -3
- data/lib/sequel/extensions/connection_expiration.rb +20 -10
- data/lib/sequel/extensions/connection_validator.rb +11 -10
- data/lib/sequel/extensions/constant_sql_override.rb +65 -0
- data/lib/sequel/extensions/constraint_validations.rb +62 -39
- data/lib/sequel/extensions/core_extensions.rb +42 -48
- data/lib/sequel/extensions/core_refinements.rb +80 -59
- data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
- data/lib/sequel/extensions/date_arithmetic.rb +98 -39
- data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
- data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
- data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
- data/lib/sequel/extensions/escaped_like.rb +100 -0
- data/lib/sequel/extensions/eval_inspect.rb +12 -15
- data/lib/sequel/extensions/exclude_or_null.rb +68 -0
- data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
- data/lib/sequel/extensions/freeze_datasets.rb +3 -0
- data/lib/sequel/extensions/from_block.rb +1 -34
- data/lib/sequel/extensions/graph_each.rb +4 -4
- data/lib/sequel/extensions/identifier_mangling.rb +180 -0
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/index_caching.rb +109 -0
- data/lib/sequel/extensions/inflector.rb +13 -5
- data/lib/sequel/extensions/integer64.rb +32 -0
- data/lib/sequel/extensions/is_distinct_from.rb +141 -0
- data/lib/sequel/extensions/looser_typecasting.rb +17 -8
- data/lib/sequel/extensions/migration.rb +119 -78
- data/lib/sequel/extensions/named_timezones.rb +88 -23
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
- data/lib/sequel/extensions/null_dataset.rb +8 -8
- data/lib/sequel/extensions/pagination.rb +32 -29
- data/lib/sequel/extensions/pg_array.rb +221 -287
- data/lib/sequel/extensions/pg_array_ops.rb +17 -9
- data/lib/sequel/extensions/pg_enum.rb +63 -23
- data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
- data/lib/sequel/extensions/pg_hstore.rb +45 -54
- data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
- data/lib/sequel/extensions/pg_inet.rb +31 -12
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +56 -29
- data/lib/sequel/extensions/pg_json.rb +417 -140
- data/lib/sequel/extensions/pg_json_ops.rb +270 -18
- data/lib/sequel/extensions/pg_loose_count.rb +4 -2
- data/lib/sequel/extensions/pg_multirange.rb +372 -0
- data/lib/sequel/extensions/pg_range.rb +131 -191
- data/lib/sequel/extensions/pg_range_ops.rb +42 -13
- data/lib/sequel/extensions/pg_row.rb +48 -81
- data/lib/sequel/extensions/pg_row_ops.rb +33 -14
- data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
- data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
- data/lib/sequel/extensions/query.rb +9 -7
- data/lib/sequel/extensions/round_timestamps.rb +0 -6
- data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
- data/lib/sequel/extensions/s.rb +60 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +71 -48
- data/lib/sequel/extensions/select_remove.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
- data/lib/sequel/extensions/server_block.rb +51 -27
- data/lib/sequel/extensions/split_array_nil.rb +4 -4
- data/lib/sequel/extensions/sql_comments.rb +119 -7
- data/lib/sequel/extensions/sql_expr.rb +2 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
- data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
- data/lib/sequel/extensions/string_agg.rb +11 -8
- data/lib/sequel/extensions/string_date_time.rb +19 -23
- data/lib/sequel/extensions/symbol_aref.rb +55 -0
- data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
- data/lib/sequel/extensions/symbol_as.rb +23 -0
- data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
- data/lib/sequel/extensions/synchronize_sql.rb +45 -0
- data/lib/sequel/extensions/to_dot.rb +10 -4
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model/associations.rb +1006 -284
- data/lib/sequel/model/base.rb +560 -805
- data/lib/sequel/model/dataset_module.rb +11 -10
- data/lib/sequel/model/default_inflections.rb +1 -1
- data/lib/sequel/model/errors.rb +10 -3
- data/lib/sequel/model/exceptions.rb +8 -10
- data/lib/sequel/model/inflections.rb +7 -20
- data/lib/sequel/model/plugins.rb +114 -0
- data/lib/sequel/model.rb +32 -82
- data/lib/sequel/plugins/active_model.rb +30 -14
- data/lib/sequel/plugins/after_initialize.rb +1 -1
- data/lib/sequel/plugins/association_dependencies.rb +25 -18
- data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
- data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
- data/lib/sequel/plugins/association_pks.rb +147 -70
- data/lib/sequel/plugins/association_proxies.rb +33 -9
- data/lib/sequel/plugins/async_thread_pool.rb +39 -0
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
- data/lib/sequel/plugins/auto_validations.rb +95 -28
- data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
- data/lib/sequel/plugins/before_after_save.rb +0 -42
- data/lib/sequel/plugins/blacklist_security.rb +21 -12
- data/lib/sequel/plugins/boolean_readers.rb +5 -5
- data/lib/sequel/plugins/boolean_subsets.rb +13 -8
- data/lib/sequel/plugins/caching.rb +25 -16
- data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
- data/lib/sequel/plugins/column_conflicts.rb +16 -3
- data/lib/sequel/plugins/column_encryption.rb +728 -0
- data/lib/sequel/plugins/column_select.rb +7 -5
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +42 -26
- data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
- data/lib/sequel/plugins/constraint_validations.rb +20 -14
- data/lib/sequel/plugins/csv_serializer.rb +56 -35
- data/lib/sequel/plugins/dataset_associations.rb +40 -17
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/defaults_setter.rb +65 -10
- data/lib/sequel/plugins/delay_add_association.rb +1 -1
- data/lib/sequel/plugins/dirty.rb +62 -24
- data/lib/sequel/plugins/eager_each.rb +3 -3
- data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
- data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
- data/lib/sequel/plugins/enum.rb +124 -0
- data/lib/sequel/plugins/error_splitter.rb +17 -12
- data/lib/sequel/plugins/finder.rb +246 -0
- data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
- data/lib/sequel/plugins/force_encoding.rb +7 -12
- data/lib/sequel/plugins/hook_class_methods.rb +37 -54
- data/lib/sequel/plugins/input_transformer.rb +18 -10
- data/lib/sequel/plugins/insert_conflict.rb +76 -0
- data/lib/sequel/plugins/insert_returning_select.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +10 -8
- data/lib/sequel/plugins/instance_hooks.rb +34 -17
- data/lib/sequel/plugins/instance_specific_default.rb +113 -0
- data/lib/sequel/plugins/inverted_subsets.rb +22 -13
- data/lib/sequel/plugins/json_serializer.rb +124 -64
- data/lib/sequel/plugins/lazy_attributes.rb +21 -14
- data/lib/sequel/plugins/list.rb +35 -21
- data/lib/sequel/plugins/many_through_many.rb +134 -21
- data/lib/sequel/plugins/modification_detection.rb +15 -5
- data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
- data/lib/sequel/plugins/nested_attributes.rb +61 -31
- data/lib/sequel/plugins/optimistic_locking.rb +3 -3
- data/lib/sequel/plugins/pg_array_associations.rb +103 -53
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
- data/lib/sequel/plugins/pg_row.rb +5 -51
- data/lib/sequel/plugins/prepared_statements.rb +60 -72
- data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
- data/lib/sequel/plugins/rcte_tree.rb +68 -82
- data/lib/sequel/plugins/require_valid_schema.rb +67 -0
- data/lib/sequel/plugins/serialization.rb +43 -46
- data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
- data/lib/sequel/plugins/sharding.rb +15 -10
- data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
- data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
- data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
- data/lib/sequel/plugins/split_values.rb +11 -6
- data/lib/sequel/plugins/sql_comments.rb +189 -0
- data/lib/sequel/plugins/static_cache.rb +77 -53
- data/lib/sequel/plugins/static_cache_cache.rb +53 -0
- data/lib/sequel/plugins/string_stripper.rb +3 -3
- data/lib/sequel/plugins/subclasses.rb +43 -10
- data/lib/sequel/plugins/subset_conditions.rb +15 -5
- data/lib/sequel/plugins/table_select.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
- data/lib/sequel/plugins/throw_failures.rb +110 -0
- data/lib/sequel/plugins/timestamps.rb +20 -8
- data/lib/sequel/plugins/touch.rb +19 -8
- data/lib/sequel/plugins/tree.rb +62 -32
- data/lib/sequel/plugins/typecast_on_load.rb +12 -4
- data/lib/sequel/plugins/unlimited_update.rb +1 -7
- data/lib/sequel/plugins/unused_associations.rb +521 -0
- data/lib/sequel/plugins/update_or_create.rb +4 -4
- data/lib/sequel/plugins/update_primary_key.rb +1 -1
- data/lib/sequel/plugins/update_refresh.rb +26 -15
- data/lib/sequel/plugins/uuid.rb +7 -11
- data/lib/sequel/plugins/validate_associated.rb +18 -0
- data/lib/sequel/plugins/validation_class_methods.rb +38 -19
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +57 -41
- data/lib/sequel/plugins/whitelist_security.rb +122 -0
- data/lib/sequel/plugins/xml_serializer.rb +30 -31
- data/lib/sequel/sql.rb +471 -331
- data/lib/sequel/timezones.rb +78 -47
- data/lib/sequel/version.rb +7 -2
- data/lib/sequel.rb +1 -1
- metadata +217 -521
- data/Rakefile +0 -164
- data/doc/active_record.rdoc +0 -928
- data/doc/release_notes/1.0.txt +0 -38
- data/doc/release_notes/1.1.txt +0 -143
- data/doc/release_notes/1.3.txt +0 -101
- data/doc/release_notes/1.4.0.txt +0 -53
- data/doc/release_notes/1.5.0.txt +0 -155
- data/doc/release_notes/2.0.0.txt +0 -298
- data/doc/release_notes/2.1.0.txt +0 -271
- data/doc/release_notes/2.10.0.txt +0 -328
- data/doc/release_notes/2.11.0.txt +0 -215
- data/doc/release_notes/2.12.0.txt +0 -534
- data/doc/release_notes/2.2.0.txt +0 -253
- data/doc/release_notes/2.3.0.txt +0 -88
- data/doc/release_notes/2.4.0.txt +0 -106
- data/doc/release_notes/2.5.0.txt +0 -137
- data/doc/release_notes/2.6.0.txt +0 -157
- data/doc/release_notes/2.7.0.txt +0 -166
- data/doc/release_notes/2.8.0.txt +0 -171
- data/doc/release_notes/2.9.0.txt +0 -97
- data/doc/release_notes/3.0.0.txt +0 -221
- data/doc/release_notes/3.1.0.txt +0 -406
- data/doc/release_notes/3.10.0.txt +0 -286
- data/doc/release_notes/3.11.0.txt +0 -254
- data/doc/release_notes/3.12.0.txt +0 -304
- data/doc/release_notes/3.13.0.txt +0 -210
- data/doc/release_notes/3.14.0.txt +0 -118
- data/doc/release_notes/3.15.0.txt +0 -78
- data/doc/release_notes/3.16.0.txt +0 -45
- data/doc/release_notes/3.17.0.txt +0 -58
- data/doc/release_notes/3.18.0.txt +0 -120
- data/doc/release_notes/3.19.0.txt +0 -67
- data/doc/release_notes/3.2.0.txt +0 -268
- data/doc/release_notes/3.20.0.txt +0 -41
- data/doc/release_notes/3.21.0.txt +0 -87
- data/doc/release_notes/3.22.0.txt +0 -39
- data/doc/release_notes/3.23.0.txt +0 -172
- data/doc/release_notes/3.24.0.txt +0 -420
- data/doc/release_notes/3.25.0.txt +0 -88
- data/doc/release_notes/3.26.0.txt +0 -88
- data/doc/release_notes/3.27.0.txt +0 -82
- data/doc/release_notes/3.28.0.txt +0 -304
- data/doc/release_notes/3.29.0.txt +0 -459
- data/doc/release_notes/3.3.0.txt +0 -192
- data/doc/release_notes/3.30.0.txt +0 -135
- data/doc/release_notes/3.31.0.txt +0 -146
- data/doc/release_notes/3.32.0.txt +0 -202
- data/doc/release_notes/3.33.0.txt +0 -157
- data/doc/release_notes/3.34.0.txt +0 -671
- data/doc/release_notes/3.35.0.txt +0 -144
- data/doc/release_notes/3.36.0.txt +0 -245
- data/doc/release_notes/3.37.0.txt +0 -338
- data/doc/release_notes/3.38.0.txt +0 -234
- data/doc/release_notes/3.39.0.txt +0 -237
- data/doc/release_notes/3.4.0.txt +0 -325
- data/doc/release_notes/3.40.0.txt +0 -73
- data/doc/release_notes/3.41.0.txt +0 -155
- data/doc/release_notes/3.42.0.txt +0 -74
- data/doc/release_notes/3.43.0.txt +0 -105
- data/doc/release_notes/3.44.0.txt +0 -152
- data/doc/release_notes/3.45.0.txt +0 -179
- data/doc/release_notes/3.46.0.txt +0 -122
- data/doc/release_notes/3.47.0.txt +0 -270
- data/doc/release_notes/3.48.0.txt +0 -477
- data/doc/release_notes/3.5.0.txt +0 -510
- data/doc/release_notes/3.6.0.txt +0 -366
- data/doc/release_notes/3.7.0.txt +0 -179
- data/doc/release_notes/3.8.0.txt +0 -151
- data/doc/release_notes/3.9.0.txt +0 -233
- data/doc/release_notes/4.0.0.txt +0 -262
- data/doc/release_notes/4.1.0.txt +0 -85
- data/doc/release_notes/4.10.0.txt +0 -226
- data/doc/release_notes/4.11.0.txt +0 -147
- data/doc/release_notes/4.12.0.txt +0 -105
- data/doc/release_notes/4.13.0.txt +0 -169
- data/doc/release_notes/4.14.0.txt +0 -68
- data/doc/release_notes/4.15.0.txt +0 -56
- data/doc/release_notes/4.16.0.txt +0 -36
- data/doc/release_notes/4.17.0.txt +0 -38
- data/doc/release_notes/4.18.0.txt +0 -36
- data/doc/release_notes/4.19.0.txt +0 -45
- data/doc/release_notes/4.2.0.txt +0 -129
- data/doc/release_notes/4.20.0.txt +0 -79
- data/doc/release_notes/4.21.0.txt +0 -94
- data/doc/release_notes/4.22.0.txt +0 -72
- data/doc/release_notes/4.23.0.txt +0 -65
- data/doc/release_notes/4.24.0.txt +0 -99
- data/doc/release_notes/4.25.0.txt +0 -181
- data/doc/release_notes/4.26.0.txt +0 -44
- data/doc/release_notes/4.27.0.txt +0 -78
- data/doc/release_notes/4.28.0.txt +0 -57
- data/doc/release_notes/4.29.0.txt +0 -41
- data/doc/release_notes/4.3.0.txt +0 -40
- data/doc/release_notes/4.30.0.txt +0 -37
- data/doc/release_notes/4.31.0.txt +0 -57
- data/doc/release_notes/4.32.0.txt +0 -132
- data/doc/release_notes/4.33.0.txt +0 -88
- data/doc/release_notes/4.34.0.txt +0 -86
- data/doc/release_notes/4.35.0.txt +0 -130
- data/doc/release_notes/4.36.0.txt +0 -116
- data/doc/release_notes/4.4.0.txt +0 -92
- data/doc/release_notes/4.5.0.txt +0 -34
- data/doc/release_notes/4.6.0.txt +0 -30
- data/doc/release_notes/4.7.0.txt +0 -103
- data/doc/release_notes/4.8.0.txt +0 -175
- data/doc/release_notes/4.9.0.txt +0 -190
- data/lib/sequel/adapters/cubrid.rb +0 -144
- data/lib/sequel/adapters/do/mysql.rb +0 -66
- data/lib/sequel/adapters/do/postgres.rb +0 -44
- data/lib/sequel/adapters/do/sqlite3.rb +0 -42
- data/lib/sequel/adapters/do.rb +0 -158
- data/lib/sequel/adapters/jdbc/as400.rb +0 -84
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
- data/lib/sequel/adapters/odbc/progress.rb +0 -10
- data/lib/sequel/adapters/shared/cubrid.rb +0 -245
- data/lib/sequel/adapters/shared/firebird.rb +0 -247
- data/lib/sequel/adapters/shared/informix.rb +0 -54
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
- data/lib/sequel/adapters/shared/progress.rb +0 -40
- data/lib/sequel/adapters/swift/mysql.rb +0 -49
- data/lib/sequel/adapters/swift/postgres.rb +0 -47
- data/lib/sequel/adapters/swift/sqlite.rb +0 -49
- data/lib/sequel/adapters/swift.rb +0 -160
- data/lib/sequel/adapters/utils/pg_types.rb +0 -70
- data/lib/sequel/dataset/mutation.rb +0 -111
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
- data/lib/sequel/extensions/filter_having.rb +0 -63
- data/lib/sequel/extensions/hash_aliases.rb +0 -49
- data/lib/sequel/extensions/meta_def.rb +0 -35
- data/lib/sequel/extensions/query_literals.rb +0 -84
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
- data/lib/sequel/extensions/set_overrides.rb +0 -76
- data/lib/sequel/no_core_ext.rb +0 -3
- data/lib/sequel/plugins/association_autoreloading.rb +0 -9
- data/lib/sequel/plugins/identifier_columns.rb +0 -47
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
- data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
- data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
- data/lib/sequel/plugins/schema.rb +0 -82
- data/lib/sequel/plugins/scissors.rb +0 -35
- data/spec/adapter_spec.rb +0 -4
- data/spec/adapters/db2_spec.rb +0 -160
- data/spec/adapters/firebird_spec.rb +0 -411
- data/spec/adapters/informix_spec.rb +0 -100
- data/spec/adapters/mssql_spec.rb +0 -733
- data/spec/adapters/mysql_spec.rb +0 -1319
- data/spec/adapters/oracle_spec.rb +0 -313
- data/spec/adapters/postgres_spec.rb +0 -3790
- data/spec/adapters/spec_helper.rb +0 -49
- data/spec/adapters/sqlanywhere_spec.rb +0 -170
- data/spec/adapters/sqlite_spec.rb +0 -688
- data/spec/bin_spec.rb +0 -258
- data/spec/core/connection_pool_spec.rb +0 -1045
- data/spec/core/database_spec.rb +0 -2636
- data/spec/core/dataset_spec.rb +0 -5175
- data/spec/core/deprecated_spec.rb +0 -70
- data/spec/core/expression_filters_spec.rb +0 -1247
- data/spec/core/mock_adapter_spec.rb +0 -464
- data/spec/core/object_graph_spec.rb +0 -303
- data/spec/core/placeholder_literalizer_spec.rb +0 -163
- data/spec/core/schema_generator_spec.rb +0 -203
- data/spec/core/schema_spec.rb +0 -1676
- data/spec/core/spec_helper.rb +0 -34
- data/spec/core/version_spec.rb +0 -7
- data/spec/core_extensions_spec.rb +0 -699
- data/spec/core_model_spec.rb +0 -2
- data/spec/core_spec.rb +0 -1
- data/spec/extensions/accessed_columns_spec.rb +0 -51
- data/spec/extensions/active_model_spec.rb +0 -85
- data/spec/extensions/after_initialize_spec.rb +0 -24
- data/spec/extensions/arbitrary_servers_spec.rb +0 -109
- data/spec/extensions/association_dependencies_spec.rb +0 -117
- data/spec/extensions/association_pks_spec.rb +0 -405
- data/spec/extensions/association_proxies_spec.rb +0 -86
- data/spec/extensions/auto_validations_spec.rb +0 -192
- data/spec/extensions/before_after_save_spec.rb +0 -40
- data/spec/extensions/blacklist_security_spec.rb +0 -88
- data/spec/extensions/blank_spec.rb +0 -69
- data/spec/extensions/boolean_readers_spec.rb +0 -93
- data/spec/extensions/boolean_subsets_spec.rb +0 -47
- data/spec/extensions/caching_spec.rb +0 -270
- data/spec/extensions/class_table_inheritance_spec.rb +0 -444
- data/spec/extensions/column_conflicts_spec.rb +0 -60
- data/spec/extensions/column_select_spec.rb +0 -108
- data/spec/extensions/columns_introspection_spec.rb +0 -91
- data/spec/extensions/composition_spec.rb +0 -242
- data/spec/extensions/connection_expiration_spec.rb +0 -121
- data/spec/extensions/connection_validator_spec.rb +0 -127
- data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
- data/spec/extensions/constraint_validations_spec.rb +0 -389
- data/spec/extensions/core_refinements_spec.rb +0 -519
- data/spec/extensions/csv_serializer_spec.rb +0 -180
- data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
- data/spec/extensions/dataset_associations_spec.rb +0 -343
- data/spec/extensions/dataset_source_alias_spec.rb +0 -51
- data/spec/extensions/date_arithmetic_spec.rb +0 -167
- data/spec/extensions/defaults_setter_spec.rb +0 -102
- data/spec/extensions/delay_add_association_spec.rb +0 -74
- data/spec/extensions/dirty_spec.rb +0 -180
- data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
- data/spec/extensions/eager_each_spec.rb +0 -66
- data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
- data/spec/extensions/error_splitter_spec.rb +0 -18
- data/spec/extensions/error_sql_spec.rb +0 -20
- data/spec/extensions/eval_inspect_spec.rb +0 -73
- data/spec/extensions/filter_having_spec.rb +0 -40
- data/spec/extensions/force_encoding_spec.rb +0 -114
- data/spec/extensions/from_block_spec.rb +0 -21
- data/spec/extensions/graph_each_spec.rb +0 -119
- data/spec/extensions/hash_aliases_spec.rb +0 -24
- data/spec/extensions/hook_class_methods_spec.rb +0 -429
- data/spec/extensions/identifier_columns_spec.rb +0 -17
- data/spec/extensions/inflector_spec.rb +0 -183
- data/spec/extensions/input_transformer_spec.rb +0 -54
- data/spec/extensions/insert_returning_select_spec.rb +0 -46
- data/spec/extensions/instance_filters_spec.rb +0 -79
- data/spec/extensions/instance_hooks_spec.rb +0 -276
- data/spec/extensions/inverted_subsets_spec.rb +0 -33
- data/spec/extensions/json_serializer_spec.rb +0 -304
- data/spec/extensions/lazy_attributes_spec.rb +0 -170
- data/spec/extensions/list_spec.rb +0 -278
- data/spec/extensions/looser_typecasting_spec.rb +0 -43
- data/spec/extensions/many_through_many_spec.rb +0 -2172
- data/spec/extensions/meta_def_spec.rb +0 -21
- data/spec/extensions/migration_spec.rb +0 -728
- data/spec/extensions/modification_detection_spec.rb +0 -80
- data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
- data/spec/extensions/named_timezones_spec.rb +0 -108
- data/spec/extensions/nested_attributes_spec.rb +0 -697
- data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
- data/spec/extensions/null_dataset_spec.rb +0 -85
- data/spec/extensions/optimistic_locking_spec.rb +0 -128
- data/spec/extensions/pagination_spec.rb +0 -118
- data/spec/extensions/pg_array_associations_spec.rb +0 -736
- data/spec/extensions/pg_array_ops_spec.rb +0 -143
- data/spec/extensions/pg_array_spec.rb +0 -390
- data/spec/extensions/pg_enum_spec.rb +0 -92
- data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
- data/spec/extensions/pg_hstore_spec.rb +0 -206
- data/spec/extensions/pg_inet_ops_spec.rb +0 -101
- data/spec/extensions/pg_inet_spec.rb +0 -52
- data/spec/extensions/pg_interval_spec.rb +0 -76
- data/spec/extensions/pg_json_ops_spec.rb +0 -275
- data/spec/extensions/pg_json_spec.rb +0 -218
- data/spec/extensions/pg_loose_count_spec.rb +0 -17
- data/spec/extensions/pg_range_ops_spec.rb +0 -58
- data/spec/extensions/pg_range_spec.rb +0 -473
- data/spec/extensions/pg_row_ops_spec.rb +0 -60
- data/spec/extensions/pg_row_plugin_spec.rb +0 -62
- data/spec/extensions/pg_row_spec.rb +0 -360
- data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
- data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
- data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
- data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
- data/spec/extensions/prepared_statements_spec.rb +0 -103
- data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
- data/spec/extensions/pretty_table_spec.rb +0 -92
- data/spec/extensions/query_literals_spec.rb +0 -183
- data/spec/extensions/query_spec.rb +0 -102
- data/spec/extensions/rcte_tree_spec.rb +0 -392
- data/spec/extensions/round_timestamps_spec.rb +0 -43
- data/spec/extensions/schema_caching_spec.rb +0 -41
- data/spec/extensions/schema_dumper_spec.rb +0 -814
- data/spec/extensions/schema_spec.rb +0 -117
- data/spec/extensions/scissors_spec.rb +0 -26
- data/spec/extensions/select_remove_spec.rb +0 -38
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
- data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
- data/spec/extensions/serialization_spec.rb +0 -362
- data/spec/extensions/server_block_spec.rb +0 -90
- data/spec/extensions/server_logging_spec.rb +0 -45
- data/spec/extensions/set_overrides_spec.rb +0 -61
- data/spec/extensions/sharding_spec.rb +0 -198
- data/spec/extensions/shared_caching_spec.rb +0 -175
- data/spec/extensions/single_table_inheritance_spec.rb +0 -297
- data/spec/extensions/singular_table_names_spec.rb +0 -22
- data/spec/extensions/skip_create_refresh_spec.rb +0 -17
- data/spec/extensions/spec_helper.rb +0 -71
- data/spec/extensions/split_array_nil_spec.rb +0 -24
- data/spec/extensions/split_values_spec.rb +0 -22
- data/spec/extensions/sql_comments_spec.rb +0 -27
- data/spec/extensions/sql_expr_spec.rb +0 -60
- data/spec/extensions/static_cache_spec.rb +0 -361
- data/spec/extensions/string_agg_spec.rb +0 -85
- data/spec/extensions/string_date_time_spec.rb +0 -95
- data/spec/extensions/string_stripper_spec.rb +0 -68
- data/spec/extensions/subclasses_spec.rb +0 -66
- data/spec/extensions/subset_conditions_spec.rb +0 -38
- data/spec/extensions/table_select_spec.rb +0 -71
- data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
- data/spec/extensions/thread_local_timezones_spec.rb +0 -67
- data/spec/extensions/timestamps_spec.rb +0 -175
- data/spec/extensions/to_dot_spec.rb +0 -154
- data/spec/extensions/touch_spec.rb +0 -203
- data/spec/extensions/tree_spec.rb +0 -274
- data/spec/extensions/typecast_on_load_spec.rb +0 -80
- data/spec/extensions/unlimited_update_spec.rb +0 -20
- data/spec/extensions/update_or_create_spec.rb +0 -87
- data/spec/extensions/update_primary_key_spec.rb +0 -100
- data/spec/extensions/update_refresh_spec.rb +0 -53
- data/spec/extensions/uuid_spec.rb +0 -106
- data/spec/extensions/validate_associated_spec.rb +0 -52
- data/spec/extensions/validation_class_methods_spec.rb +0 -1027
- data/spec/extensions/validation_helpers_spec.rb +0 -554
- data/spec/extensions/xml_serializer_spec.rb +0 -207
- data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
- data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
- data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
- data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
- data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
- data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/double_migration/001_create_sessions.rb +0 -9
- data/spec/files/double_migration/002_create_nodes.rb +0 -19
- data/spec/files/double_migration/003_3_create_users.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
- data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
- data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
- data/spec/files/empty_migration/001_create_sessions.rb +0 -9
- data/spec/files/empty_migration/002_create_nodes.rb +0 -0
- data/spec/files/empty_migration/003_3_create_users.rb +0 -4
- data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
- data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
- data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
- data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
- data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
- data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/reversible_migrations/001_reversible.rb +0 -5
- data/spec/files/reversible_migrations/002_reversible.rb +0 -5
- data/spec/files/reversible_migrations/003_reversible.rb +0 -5
- data/spec/files/reversible_migrations/004_reversible.rb +0 -5
- data/spec/files/reversible_migrations/005_reversible.rb +0 -10
- data/spec/files/reversible_migrations/006_reversible.rb +0 -10
- data/spec/files/reversible_migrations/007_reversible.rb +0 -10
- data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
- data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
- data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
- data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
- data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
- data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
- data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
- data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
- data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
- data/spec/guards_helper.rb +0 -55
- data/spec/integration/associations_test.rb +0 -2506
- data/spec/integration/database_test.rb +0 -113
- data/spec/integration/dataset_test.rb +0 -1858
- data/spec/integration/eager_loader_test.rb +0 -687
- data/spec/integration/migrator_test.rb +0 -262
- data/spec/integration/model_test.rb +0 -230
- data/spec/integration/plugin_test.rb +0 -2297
- data/spec/integration/prepared_statement_test.rb +0 -467
- data/spec/integration/schema_test.rb +0 -815
- data/spec/integration/spec_helper.rb +0 -56
- data/spec/integration/timezone_test.rb +0 -86
- data/spec/integration/transaction_test.rb +0 -406
- data/spec/integration/type_test.rb +0 -133
- data/spec/model/association_reflection_spec.rb +0 -565
- data/spec/model/associations_spec.rb +0 -4589
- data/spec/model/base_spec.rb +0 -759
- data/spec/model/class_dataset_methods_spec.rb +0 -150
- data/spec/model/dataset_methods_spec.rb +0 -149
- data/spec/model/eager_loading_spec.rb +0 -2197
- data/spec/model/hooks_spec.rb +0 -604
- data/spec/model/inflector_spec.rb +0 -26
- data/spec/model/model_spec.rb +0 -1097
- data/spec/model/plugins_spec.rb +0 -299
- data/spec/model/record_spec.rb +0 -2162
- data/spec/model/spec_helper.rb +0 -46
- data/spec/model/validations_spec.rb +0 -193
- data/spec/model_no_assoc_spec.rb +0 -1
- data/spec/model_spec.rb +0 -1
- data/spec/plugin_spec.rb +0 -1
- data/spec/sequel_coverage.rb +0 -15
- data/spec/spec_config.rb +0 -10
data/doc/association_basics.rdoc
CHANGED
@@ -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.
|
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(:
|
23
|
+
Album.create(artist_id: @artist.id, name: 'RF')
|
24
24
|
|
25
|
-
With
|
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(:
|
42
|
+
@artist.add_album(name: 'RF')
|
43
43
|
|
44
|
-
It also makes it easier to
|
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
|
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
|
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
|
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, :
|
189
|
+
many_to_one :artist, key: :artistid
|
192
190
|
end
|
193
191
|
class Artist
|
194
|
-
one_to_many :albums, :
|
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, :
|
215
|
-
:
|
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, :
|
219
|
-
:
|
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
|
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, :
|
239
|
-
many_to_one :composer, :
|
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, :
|
243
|
-
one_to_many :composer_albums, :
|
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, :
|
259
|
-
one_to_many :children, :
|
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, :
|
272
|
-
:
|
273
|
-
many_to_many :direct_successors, :
|
274
|
-
:
|
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(:
|
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
|
-
|
296
|
-
|
297
|
-
|
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
|
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
|
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
|
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
|
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
|
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(:
|
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(:
|
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(:
|
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(:
|
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
|
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(:
|
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(:
|
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(:
|
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(:
|
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(:
|
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(:
|
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, :
|
488
|
+
Album.one_to_many :popular_tags, clone: :tags do |ds|
|
487
489
|
ds.where{times_used > 1000}
|
488
490
|
end
|
489
|
-
Album.where(:
|
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, :
|
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, :
|
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, :
|
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_(
|
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(:
|
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(:
|
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
|
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>=
|
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>
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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(:
|
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>.
|
872
|
-
|
873
|
-
|
874
|
-
|
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, :
|
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, :
|
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, :
|
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, :
|
931
|
-
Album.many_to_one :artist, :
|
932
|
-
Album.many_to_one :artist, :
|
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
|
939
|
-
Foo::Album.many_to_one :artist, :
|
940
|
-
Foo::Album.many_to_one :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.
|
947
|
-
composite key association.
|
960
|
+
Defaults to :<i>association</i>_id.
|
948
961
|
|
949
|
-
Album.many_to_one :artist
|
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
|
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
|
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
|
-
|
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, :
|
977
|
-
|
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, :
|
996
|
-
Album.many_to_many :tags, :
|
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, :
|
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, :
|
1008
|
-
|
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
|
1021
|
-
Album.many_to_many :artists
|
1022
|
-
Person.many_to_many :colleges
|
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
|
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
|
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, :
|
1066
|
-
:
|
1067
|
-
one_to_many :romaji_verses, :
|
1068
|
-
one_to_many :japanese_verses, :
|
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 :
|
1078
|
-
in
|
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
|
-
|
1110
|
+
Artist.one_to_many :songs, dataset: (lambda do |r|
|
1097
1111
|
r.associated_dataset.select_all(:songs).
|
1098
|
-
join(
|
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
|
-
#
|
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
|
1123
|
-
Album.one_to_many :artist
|
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
|
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
|
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=>
|
1154
|
-
ds.where(:
|
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
|
1166
|
-
|
1167
|
-
|
1168
|
-
is aborted.
|
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, :
|
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, :
|
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(:
|
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, :
|
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, :
|
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(:
|
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, :
|
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, :
|
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(:
|
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
|
-
|
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
|
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, :
|
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, :
|
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, :
|
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, :
|
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,
|
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, :
|
1334
|
-
|
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, :
|
1338
|
-
|
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, :
|
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, :
|
1367
|
-
:
|
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, :
|
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, :
|
1398
|
-
:
|
1399
|
-
:
|
1400
|
-
Sequel.function(:lower, Sequel.
|
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, :
|
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, :
|
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-
|
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, :
|
1453
|
-
:eager_grapher=>(
|
1454
|
-
eo[:self].graph(
|
1455
|
-
:
|
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, :
|
1487
|
-
:
|
1488
|
-
:
|
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, :
|
1506
|
-
:
|
1507
|
-
:
|
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
|
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 +
|
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, :
|
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, :
|
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, :
|
1572
|
-
:
|
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, :
|
1576
|
-
:
|
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,
|
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
|
1715
|
-
|
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
|
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, :
|
1743
|
-
Artist.eager(:albums)
|
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.
|
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, :
|
1779
|
-
Foo::Album.many_to_one :artist, :
|
1780
|
-
Foo::Album.many_to_one :artist, :
|
1781
|
-
Foo::Album.many_to_one :artist, :
|
1782
|
-
Foo::Album.many_to_one :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.
|
1788
|
-
is not included in the model's class,
|
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
|
-
|