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?, #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
permalink #associated_key_alias ⇒ Object
The alias to use for the associated key when eagerly loading
1235 1236 1237 |
# File 'lib/sequel/model/associations.rb', line 1235 def associated_key_alias self[:left_key_alias] end |
permalink #associated_key_array ⇒ Object
Array of associated keys used when eagerly loading.
1240 1241 1242 1243 1244 1245 1246 1247 1248 |
# File 'lib/sequel/model/associations.rb', line 1240 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 |
permalink #associated_key_column ⇒ Object
The column to use for the associated key when eagerly loading
1251 1252 1253 |
# File 'lib/sequel/model/associations.rb', line 1251 def associated_key_column self[:left_key] end |
permalink #associated_object_keys ⇒ Object
Alias of right_primary_keys
1256 1257 1258 |
# File 'lib/sequel/model/associations.rb', line 1256 def associated_object_keys right_primary_keys end |
permalink #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.
1262 1263 1264 |
# File 'lib/sequel/model/associations.rb', line 1262 def can_have_associated_objects?(obj) !self[:left_primary_keys].any?{|k| obj.get_column_value(k).nil?} end |
permalink #cloneable?(ref) ⇒ Boolean
one_through_one and many_to_many associations can be clones
1267 1268 1269 |
# File 'lib/sequel/model/associations.rb', line 1267 def cloneable?(ref) ref[:type] == :many_to_many || ref[:type] == :one_through_one end |
permalink #default_associated_key_alias ⇒ Object
The default associated key alias(es) to use when eager loading associations via eager.
1273 1274 1275 |
# File 'lib/sequel/model/associations.rb', line 1273 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 |
permalink #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.
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 |
# File 'lib/sequel/model/associations.rb', line 1279 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.values.delete(delete_rn) if delete_rn hash_key = if uses_lcks left_key_alias.map{|k| assoc_record.values.delete(k)} else assoc_record.values.delete(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 |
permalink #default_join_table ⇒ Object
Default name symbol for the join table.
1310 1311 1312 |
# File 'lib/sequel/model/associations.rb', line 1310 def default_join_table [self[:class_name], self[:model].name].map{|i| underscore(pluralize(demodulize(i)))}.sort.join('_').to_sym end |
permalink #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).
1316 1317 1318 |
# File 'lib/sequel/model/associations.rb', line 1316 def default_left_key :"#{underscore(demodulize(self[:model].name))}_id" end |
permalink #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).
1322 1323 1324 |
# File 'lib/sequel/model/associations.rb', line 1322 def default_right_key :"#{singularize(self[:name])}_id" end |
permalink #eager_loading_use_associated_key? ⇒ Boolean
many_to_many associations need to select a key in an associated table to eagerly load
1355 1356 1357 |
# File 'lib/sequel/model/associations.rb', line 1355 def eager_loading_use_associated_key? !separate_query_per_table? end |
permalink #finalize_settings ⇒ Object
[View source]
1338 1339 1340 |
# File 'lib/sequel/model/associations.rb', line 1338 def finalize_settings FINALIZE_SETTINGS end |
permalink #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.
1367 1368 1369 1370 1371 1372 |
# File 'lib/sequel/model/associations.rb', line 1367 def join_table_alias cached_fetch(:join_table_alias) do s, a = split_join_table_alias a || s end end |
permalink #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.
1361 1362 1363 |
# File 'lib/sequel/model/associations.rb', line 1361 def join_table_source cached_fetch(:join_table_source){split_join_table_alias[0]} end |
permalink #need_associated_primary_key? ⇒ Boolean
Whether the associated object needs a primary key to be added/removed, true for many_to_many associations.
1377 1378 1379 |
# File 'lib/sequel/model/associations.rb', line 1377 def need_associated_primary_key? true end |
permalink #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.
1344 1345 1346 |
# File 'lib/sequel/model/associations.rb', line 1344 def predicate_key cached_fetch(:predicate_key){qualify(join_table_alias, self[:left_key])} end |
permalink #qualified_right_key ⇒ Object
The right key qualified by the join table.
1350 1351 1352 |
# File 'lib/sequel/model/associations.rb', line 1350 def qualified_right_key cached_fetch(:qualified_right_key){qualify(join_table_alias, self[:right_key])} end |
permalink #qualified_right_primary_key ⇒ Object
#right_primary_key qualified by the associated table
1382 1383 1384 |
# File 'lib/sequel/model/associations.rb', line 1382 def qualified_right_primary_key cached_fetch(:qualified_right_primary_key){qualify_assoc(right_primary_key)} end |
permalink #right_primary_key ⇒ Object
The primary key column(s) to use in the associated table (can be symbol or array).
1387 1388 1389 |
# File 'lib/sequel/model/associations.rb', line 1387 def right_primary_key cached_fetch(:right_primary_key){associated_class.primary_key || raise(Error, "no primary key specified for #{associated_class.inspect}")} end |
permalink #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.
1398 1399 1400 |
# File 'lib/sequel/model/associations.rb', line 1398 def right_primary_key_method cached_fetch(:right_primary_key_method){right_primary_key} end |
permalink #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.
1404 1405 1406 |
# File 'lib/sequel/model/associations.rb', line 1404 def right_primary_key_methods cached_fetch(:right_primary_key_methods){Array(right_primary_key_method)} end |
permalink #right_primary_keys ⇒ Object
The primary key columns to use in the associated table (always array).
1392 1393 1394 |
# File 'lib/sequel/model/associations.rb', line 1392 def right_primary_keys cached_fetch(:right_primary_keys){Array(right_primary_key)} end |
permalink #select ⇒ Object
The columns to select when loading the association, associated_class.table_name.* by default.
1409 1410 1411 |
# File 'lib/sequel/model/associations.rb', line 1409 def select cached_fetch(:select){default_select} end |
permalink #separate_query_per_table? ⇒ Boolean
Whether a separate query should be used for the join table.
1414 1415 1416 |
# File 'lib/sequel/model/associations.rb', line 1414 def separate_query_per_table? self[:join_table_db] end |