Class: Sequel::Model::Associations::ManyToManyAssociationReflection
- Inherits:
-
AssociationReflection
- Object
- Hash
- AssociationReflection
- Sequel::Model::Associations::ManyToManyAssociationReflection
- Defined in:
- lib/sequel/model/associations.rb
Direct Known Subclasses
OneThroughOneAssociationReflection, Plugins::ManyThroughMany::ManyThroughManyAssociationReflection
Constant Summary collapse
- FINALIZE_SETTINGS =
superclass::FINALIZE_SETTINGS.merge( :associated_key_array=>:associated_key_array, :qualified_right_key=>:qualified_right_key, :join_table_source=>:join_table_source, :join_table_alias=>:join_table_alias, :qualified_right_primary_key=>:qualified_right_primary_key, :right_primary_key=>:right_primary_key, :right_primary_keys=>:right_primary_keys, :right_primary_key_method=>:right_primary_key_method, :right_primary_key_methods=>:right_primary_key_methods, :select=>:select ).freeze
Constants inherited from AssociationReflection
AssociationReflection::ASSOCIATION_DATASET_PROC
Instance Method Summary collapse
-
#associated_key_alias ⇒ Object
The alias to use for the associated key when eagerly loading.
-
#associated_key_array ⇒ Object
Array of associated keys used when eagerly loading.
-
#associated_key_column ⇒ Object
The column to use for the associated key when eagerly loading.
-
#associated_object_keys ⇒ Object
Alias of right_primary_keys.
-
#can_have_associated_objects?(obj) ⇒ Boolean
many_to_many associations can only have associated objects if none of the :left_primary_keys options have a nil value.
-
#cloneable?(ref) ⇒ Boolean
one_through_one and many_to_many associations can be clones.
-
#default_associated_key_alias ⇒ Object
The default associated key alias(es) to use when eager loading associations via eager.
-
#default_eager_loader(eo) ⇒ Object
The default eager loader used if the user doesn’t override it.
-
#default_join_table ⇒ Object
Default name symbol for the join table.
-
#default_left_key ⇒ Object
Default foreign key name symbol for key in join table that points to current table’s primary key (or :left_primary_key column).
-
#default_right_key ⇒ Object
Default foreign key name symbol for foreign key in join table that points to the association’s table’s primary key (or :right_primary_key column).
-
#eager_loading_use_associated_key? ⇒ Boolean
many_to_many associations need to select a key in an associated table to eagerly load.
- #finalize_settings ⇒ Object
-
#join_table_alias ⇒ Object
(also: #associated_key_table)
The join table itself, unless it is aliased, in which case this is the alias.
-
#join_table_source ⇒ Object
The source of the join table.
-
#need_associated_primary_key? ⇒ Boolean
Whether the associated object needs a primary key to be added/removed, true for many_to_many associations.
-
#predicate_key ⇒ Object
(also: #qualified_left_key)
The hash key to use for the eager loading predicate (left side of IN (1, 2, 3)).
-
#qualified_right_key ⇒ Object
The right key qualified by the join table.
-
#qualified_right_primary_key ⇒ Object
#right_primary_key qualified by the associated table.
-
#right_primary_key ⇒ Object
The primary key column(s) to use in the associated table (can be symbol or array).
-
#right_primary_key_method ⇒ Object
The method symbol or array of method symbols to call on the associated objects to get the foreign key values for the join table.
-
#right_primary_key_methods ⇒ Object
The array of method symbols to call on the associated objects to get the foreign key values for the join table.
-
#right_primary_keys ⇒ Object
The primary key columns to use in the associated table (always array).
-
#select ⇒ Object
The columns to select when loading the association, associated_class.table_name.* by default.
-
#separate_query_per_table? ⇒ Boolean
Whether a separate query should be used for the join table.
Methods inherited from AssociationReflection
#_add_method, #_remove_all_method, #_remove_method, #_setter_method, #add_method, #apply_dataset_changes, #apply_distinct_on_eager_limit_strategy, #apply_eager_dataset_changes, #apply_eager_graph_limit_strategy, #apply_eager_limit_strategy, #apply_ruby_eager_limit_strategy, #apply_window_function_eager_limit_strategy, #assign_singular?, #associated_class, #associated_dataset, #association_dataset_for, #association_dataset_proc, #association_method, #dataset_method, #dataset_need_primary_key?, #delete_row_number_column, #eager_graph_lazy_dataset?, #eager_graph_limit_strategy, #eager_limit_strategy, #eager_load_results, #eager_loader_key, #filter_by_associations_add_conditions?, #filter_by_associations_conditions_expression, #finalize, #handle_silent_modification_failure?, #hash, #initialize_association_cache, #inspect, #limit_and_offset, #placeholder_loader, #predicate_key_values, #predicate_keys, #qualify, #qualify_assoc, #qualify_cur, #reciprocal, #reciprocal_array?, #remove_all_method, #remove_before_destroy?, #remove_method, #remove_should_check_existing?, #returns_array?, #set_reciprocal_to_self?, #setter_method, #slice_range
Methods included from Inflections
clear, irregular, plural, singular, uncountable
Methods inherited from Hash
#&, #case, #hstore, #pg_json, #pg_jsonb, #sql_expr, #sql_negate, #sql_or, #|, #~
Instance Method Details
#associated_key_alias ⇒ Object
The alias to use for the associated key when eagerly loading
1361 1362 1363 |
# File 'lib/sequel/model/associations.rb', line 1361 def associated_key_alias self[:left_key_alias] end |
#associated_key_array ⇒ Object
Array of associated keys used when eagerly loading.
1366 1367 1368 1369 1370 1371 1372 1373 1374 |
# File 'lib/sequel/model/associations.rb', line 1366 def associated_key_array cached_fetch(:associated_key_array) do if self[:uses_left_composite_keys] associated_key_alias.zip(predicate_keys).map{|a, k| SQL::AliasedExpression.new(k, a)} else [SQL::AliasedExpression.new(predicate_key, associated_key_alias)] end end end |
#associated_key_column ⇒ Object
The column to use for the associated key when eagerly loading
1377 1378 1379 |
# File 'lib/sequel/model/associations.rb', line 1377 def associated_key_column self[:left_key] end |
#associated_object_keys ⇒ Object
Alias of right_primary_keys
1382 1383 1384 |
# File 'lib/sequel/model/associations.rb', line 1382 def associated_object_keys right_primary_keys end |
#can_have_associated_objects?(obj) ⇒ Boolean
many_to_many associations can only have associated objects if none of the :left_primary_keys options have a nil value.
1388 1389 1390 |
# File 'lib/sequel/model/associations.rb', line 1388 def can_have_associated_objects?(obj) !self[:left_primary_keys].any?{|k| obj.get_column_value(k).nil?} end |
#cloneable?(ref) ⇒ Boolean
one_through_one and many_to_many associations can be clones
1393 1394 1395 |
# File 'lib/sequel/model/associations.rb', line 1393 def cloneable?(ref) ref[:type] == :many_to_many || ref[:type] == :one_through_one end |
#default_associated_key_alias ⇒ Object
The default associated key alias(es) to use when eager loading associations via eager.
1399 1400 1401 |
# File 'lib/sequel/model/associations.rb', line 1399 def default_associated_key_alias self[:uses_left_composite_keys] ? (0...self[:left_keys].length).map{|i| :"x_foreign_key_#{i}_x"} : :x_foreign_key_x end |
#default_eager_loader(eo) ⇒ Object
The default eager loader used if the user doesn’t override it. Extracted to a method so the code can be shared with the many_through_many plugin.
1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 |
# File 'lib/sequel/model/associations.rb', line 1405 def default_eager_loader(eo) h = eo[:id_map] assign_singular = assign_singular? delete_rn = delete_row_number_column uses_lcks = self[:uses_left_composite_keys] left_key_alias = self[:left_key_alias] name = self[:name] self[:model].eager_load_results(self, eo) do |assoc_record| assoc_record.remove_key!(delete_rn) if delete_rn hash_key = if uses_lcks left_key_alias.map{|k| assoc_record.remove_key!(k)} else assoc_record.remove_key!(left_key_alias) end objects = h[hash_key] if assign_singular objects.each do |object| object.associations[name] ||= assoc_record end else objects.each do |object| object.associations[name].push(assoc_record) end end end end |
#default_join_table ⇒ Object
Default name symbol for the join table.
1436 1437 1438 |
# File 'lib/sequel/model/associations.rb', line 1436 def default_join_table [self[:class_name], self[:model].name].map{|i| underscore(pluralize(demodulize(i)))}.sort.join('_').to_sym end |
#default_left_key ⇒ Object
Default foreign key name symbol for key in join table that points to current table’s primary key (or :left_primary_key column).
1442 1443 1444 |
# File 'lib/sequel/model/associations.rb', line 1442 def default_left_key :"#{underscore(demodulize(self[:model].name))}_id" end |
#default_right_key ⇒ Object
Default foreign key name symbol for foreign key in join table that points to the association’s table’s primary key (or :right_primary_key column).
1448 1449 1450 |
# File 'lib/sequel/model/associations.rb', line 1448 def default_right_key :"#{singularize(self[:name])}_id" end |
#eager_loading_use_associated_key? ⇒ Boolean
many_to_many associations need to select a key in an associated table to eagerly load
1481 1482 1483 |
# File 'lib/sequel/model/associations.rb', line 1481 def eager_loading_use_associated_key? !separate_query_per_table? end |
#finalize_settings ⇒ Object
1464 1465 1466 |
# File 'lib/sequel/model/associations.rb', line 1464 def finalize_settings FINALIZE_SETTINGS end |
#join_table_alias ⇒ Object Also known as: associated_key_table
The join table itself, unless it is aliased, in which case this is the alias.
1493 1494 1495 1496 1497 1498 |
# File 'lib/sequel/model/associations.rb', line 1493 def join_table_alias cached_fetch(:join_table_alias) do s, a = split_join_table_alias a || s end end |
#join_table_source ⇒ Object
The source of the join table. This is the join table itself, unless it is aliased, in which case it is the unaliased part.
1487 1488 1489 |
# File 'lib/sequel/model/associations.rb', line 1487 def join_table_source cached_fetch(:join_table_source){split_join_table_alias[0]} end |
#need_associated_primary_key? ⇒ Boolean
Whether the associated object needs a primary key to be added/removed, true for many_to_many associations.
1503 1504 1505 |
# File 'lib/sequel/model/associations.rb', line 1503 def need_associated_primary_key? true end |
#predicate_key ⇒ Object Also known as: qualified_left_key
The hash key to use for the eager loading predicate (left side of IN (1, 2, 3)). The left key qualified by the join table.
1470 1471 1472 |
# File 'lib/sequel/model/associations.rb', line 1470 def predicate_key cached_fetch(:predicate_key){qualify(join_table_alias, self[:left_key])} end |
#qualified_right_key ⇒ Object
The right key qualified by the join table.
1476 1477 1478 |
# File 'lib/sequel/model/associations.rb', line 1476 def qualified_right_key cached_fetch(:qualified_right_key){qualify(join_table_alias, self[:right_key])} end |
#qualified_right_primary_key ⇒ Object
#right_primary_key qualified by the associated table
1508 1509 1510 |
# File 'lib/sequel/model/associations.rb', line 1508 def qualified_right_primary_key cached_fetch(:qualified_right_primary_key){qualify_assoc(right_primary_key)} end |
#right_primary_key ⇒ Object
The primary key column(s) to use in the associated table (can be symbol or array).
1513 1514 1515 |
# File 'lib/sequel/model/associations.rb', line 1513 def right_primary_key cached_fetch(:right_primary_key){associated_class.primary_key || raise(Error, "no primary key specified for #{associated_class.inspect}")} end |
#right_primary_key_method ⇒ Object
The method symbol or array of method symbols to call on the associated objects to get the foreign key values for the join table.
1524 1525 1526 |
# File 'lib/sequel/model/associations.rb', line 1524 def right_primary_key_method cached_fetch(:right_primary_key_method){right_primary_key} end |
#right_primary_key_methods ⇒ Object
The array of method symbols to call on the associated objects to get the foreign key values for the join table.
1530 1531 1532 |
# File 'lib/sequel/model/associations.rb', line 1530 def right_primary_key_methods cached_fetch(:right_primary_key_methods){Array(right_primary_key_method)} end |
#right_primary_keys ⇒ Object
The primary key columns to use in the associated table (always array).
1518 1519 1520 |
# File 'lib/sequel/model/associations.rb', line 1518 def right_primary_keys cached_fetch(:right_primary_keys){Array(right_primary_key)} end |
#select ⇒ Object
The columns to select when loading the association, associated_class.table_name.* by default.
1535 1536 1537 |
# File 'lib/sequel/model/associations.rb', line 1535 def select cached_fetch(:select){default_select} end |
#separate_query_per_table? ⇒ Boolean
Whether a separate query should be used for the join table.
1540 1541 1542 |
# File 'lib/sequel/model/associations.rb', line 1540 def separate_query_per_table? self[:join_table_db] end |