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.
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
#associated_key_alias ⇒ Object
The alias to use for the associated key when eagerly loading
1197 1198 1199 |
# File 'lib/sequel/model/associations.rb', line 1197 def associated_key_alias self[:left_key_alias] end |
#associated_key_array ⇒ Object
Array of associated keys used when eagerly loading.
1202 1203 1204 1205 1206 1207 1208 1209 1210 |
# File 'lib/sequel/model/associations.rb', line 1202 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
1213 1214 1215 |
# File 'lib/sequel/model/associations.rb', line 1213 def associated_key_column self[:left_key] end |
#associated_object_keys ⇒ Object
Alias of right_primary_keys
1218 1219 1220 |
# File 'lib/sequel/model/associations.rb', line 1218 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.
1224 1225 1226 |
# File 'lib/sequel/model/associations.rb', line 1224 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
1229 1230 1231 |
# File 'lib/sequel/model/associations.rb', line 1229 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.
1235 1236 1237 |
# File 'lib/sequel/model/associations.rb', line 1235 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.
1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 |
# File 'lib/sequel/model/associations.rb', line 1241 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 |
#default_join_table ⇒ Object
Default name symbol for the join table.
1272 1273 1274 |
# File 'lib/sequel/model/associations.rb', line 1272 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).
1278 1279 1280 |
# File 'lib/sequel/model/associations.rb', line 1278 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).
1284 1285 1286 |
# File 'lib/sequel/model/associations.rb', line 1284 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
1317 1318 1319 |
# File 'lib/sequel/model/associations.rb', line 1317 def eager_loading_use_associated_key? true end |
#finalize_settings ⇒ Object
1300 1301 1302 |
# File 'lib/sequel/model/associations.rb', line 1300 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.
1329 1330 1331 1332 1333 1334 |
# File 'lib/sequel/model/associations.rb', line 1329 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.
1323 1324 1325 |
# File 'lib/sequel/model/associations.rb', line 1323 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.
1339 1340 1341 |
# File 'lib/sequel/model/associations.rb', line 1339 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.
1306 1307 1308 |
# File 'lib/sequel/model/associations.rb', line 1306 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.
1312 1313 1314 |
# File 'lib/sequel/model/associations.rb', line 1312 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
1344 1345 1346 |
# File 'lib/sequel/model/associations.rb', line 1344 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).
1349 1350 1351 |
# File 'lib/sequel/model/associations.rb', line 1349 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.
1360 1361 1362 |
# File 'lib/sequel/model/associations.rb', line 1360 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.
1366 1367 1368 |
# File 'lib/sequel/model/associations.rb', line 1366 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).
1354 1355 1356 |
# File 'lib/sequel/model/associations.rb', line 1354 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.
1371 1372 1373 |
# File 'lib/sequel/model/associations.rb', line 1371 def select cached_fetch(:select){default_select} end |