Class: Sequel::Model::Associations::ManyToManyAssociationReflection

Inherits:
AssociationReflection show all
Defined in:
lib/sequel/model/associations.rb

Constant Summary

Constants included from Inflections

Inflections::CAMELIZE_CONVERT_REGEXP, Inflections::CAMELIZE_MODULE_REGEXP, Inflections::DASH, Inflections::DEMODULIZE_CONVERT_REGEXP, Inflections::EMPTY_STRING, Inflections::SLASH, Inflections::UNDERSCORE, Inflections::UNDERSCORE_CONVERT_REGEXP1, Inflections::UNDERSCORE_CONVERT_REGEXP2, Inflections::UNDERSCORE_CONVERT_REPLACE, Inflections::UNDERSCORE_MODULE_REGEXP, Inflections::VALID_CONSTANT_NAME_REGEXP

Instance Method Summary collapse

Methods inherited from AssociationReflection

#_add_method, #_dataset_method, #_remove_all_method, #_remove_method, #_setter_method, #add_method, #associated_class, #association_method, #dataset_helper_method, #dataset_method, #dataset_need_primary_key?, #eager_graph_lazy_dataset?, #eager_limit_strategy, #limit_and_offset, #qualify, #qualify_assoc, #qualify_cur, #reciprocal_array?, #remove_all_method, #remove_before_destroy?, #remove_method, #remove_should_check_existing?, #returns_array?, #set_reciprocal_to_self?, #setter_method

Methods included from Inflections

clear, irregular, plural, singular, uncountable

Methods inherited from Hash

#&, #case, #sql_expr, #sql_negate, #sql_or, #|, #~

Instance Method Details

#associated_key_aliasObject

The alias to use for the associated key when eagerly loading



422
423
424
# File 'lib/sequel/model/associations.rb', line 422

def associated_key_alias
  self[:left_key_alias]
end

#associated_key_columnObject

The column to use for the associated key when eagerly loading



427
428
429
# File 'lib/sequel/model/associations.rb', line 427

def associated_key_column
  self[:left_key]
end

#associated_object_keysObject

Alias of right_primary_keys



432
433
434
# File 'lib/sequel/model/associations.rb', line 432

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.

Returns:

  • (Boolean)


438
439
440
# File 'lib/sequel/model/associations.rb', line 438

def can_have_associated_objects?(obj)
  !self[:left_primary_keys].any?{|k| obj.send(k).nil?}
end

#default_associated_key_aliasObject

The default associated key alias(es) to use when eager loading associations via eager.



444
445
446
# File 'lib/sequel/model/associations.rb', line 444

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_join_tableObject

Default name symbol for the join table.



449
450
451
# File 'lib/sequel/model/associations.rb', line 449

def default_join_table
  [self[:class_name], self[:model].name].map{|i| underscore(pluralize(demodulize(i)))}.sort.join('_').to_sym
end

#default_left_keyObject

Default foreign key name symbol for key in join table that points to current table’s primary key (or :left_primary_key column).



455
456
457
# File 'lib/sequel/model/associations.rb', line 455

def default_left_key
  :"#{underscore(demodulize(self[:model].name))}_id"
end

#default_right_keyObject

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).



461
462
463
# File 'lib/sequel/model/associations.rb', line 461

def default_right_key
  :"#{singularize(self[:name])}_id"
end

#eager_loader_keyObject

The key to use for the key hash when eager loading



466
467
468
# File 'lib/sequel/model/associations.rb', line 466

def eager_loader_key
  self[:eager_loader_key] ||= self[:left_primary_key]
end

#eager_loading_predicate_keyObject 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.



472
473
474
# File 'lib/sequel/model/associations.rb', line 472

def eager_loading_predicate_key
  self[:eager_loading_predicate_key] ||= qualify(join_table_alias, self[:left_key])
end

#eager_loading_use_associated_key?Boolean

many_to_many associations need to select a key in an associated table to eagerly load

Returns:

  • (Boolean)


483
484
485
# File 'lib/sequel/model/associations.rb', line 483

def eager_loading_use_associated_key?
  true
end

#join_table_aliasObject Also known as: associated_key_table

The join table itself, unless it is aliased, in which case this is the alias.



498
499
500
501
502
503
# File 'lib/sequel/model/associations.rb', line 498

def join_table_alias
  fetch(:join_table_alias) do
    split_join_table_alias
    self[:join_table_alias]
  end
end

#join_table_sourceObject

The source of the join table. This is the join table itself, unless it is aliased, in which case it is the unaliased part.



489
490
491
492
493
494
# File 'lib/sequel/model/associations.rb', line 489

def join_table_source
  fetch(:join_table_source) do
    split_join_table_alias
    self[:join_table_source]
  end
end

#need_associated_primary_key?Boolean

Whether the associated object needs a primary key to be added/removed, true for many_to_many associations.

Returns:

  • (Boolean)


508
509
510
# File 'lib/sequel/model/associations.rb', line 508

def need_associated_primary_key?
  true
end

#qualified_right_keyObject

The right key qualified by the join table.



478
479
480
# File 'lib/sequel/model/associations.rb', line 478

def qualified_right_key
  self[:qualified_right_key] ||= qualify(join_table_alias, self[:right_key])
end

#qualified_right_primary_keyObject

#right_primary_key qualified by the associated table



529
530
531
# File 'lib/sequel/model/associations.rb', line 529

def qualified_right_primary_key
  self[:qualified_right_primary_key] ||= qualify_assoc(right_primary_key)
end

#reciprocalObject

Returns the reciprocal association symbol, if one exists.



513
514
515
516
517
518
519
520
521
522
523
524
525
526
# File 'lib/sequel/model/associations.rb', line 513

def reciprocal
  return self[:reciprocal] if include?(:reciprocal)
  left_keys = self[:left_keys]
  right_keys = self[:right_keys]
  join_table = self[:join_table]
  associated_class.all_association_reflections.each do |assoc_reflect|
    if assoc_reflect[:type] == :many_to_many && assoc_reflect[:left_keys] == right_keys &&
       assoc_reflect[:right_keys] == left_keys && assoc_reflect[:join_table] == join_table &&
       assoc_reflect.associated_class == self[:model]
      return self[:reciprocal] = assoc_reflect[:name]
    end
  end
  self[:reciprocal] = nil
end

#right_primary_keyObject

The primary key column(s) to use in the associated table (can be symbol or array).



534
535
536
# File 'lib/sequel/model/associations.rb', line 534

def right_primary_key
  self[:right_primary_key] ||= associated_class.primary_key
end

#right_primary_key_methodObject

The method symbol or array of method symbols to call on the associated objects to get the foreign key values for the join table.



545
546
547
# File 'lib/sequel/model/associations.rb', line 545

def right_primary_key_method
  self[:right_primary_key_method] ||= right_primary_key
end

#right_primary_key_methodsObject

The array of method symbols to call on the associated objects to get the foreign key values for the join table.



551
552
553
# File 'lib/sequel/model/associations.rb', line 551

def right_primary_key_methods
  self[:right_primary_key_methods] ||= Array(right_primary_key_method)
end

#right_primary_keysObject

The primary key columns to use in the associated table (always array).



539
540
541
# File 'lib/sequel/model/associations.rb', line 539

def right_primary_keys
  self[:right_primary_keys] ||= Array(right_primary_key)
end

#selectObject

The columns to select when loading the association, associated_class.table_name.* by default.



556
557
558
559
# File 'lib/sequel/model/associations.rb', line 556

def select
 return self[:select] if include?(:select)
 self[:select] ||= Sequel::SQL::ColumnAll.new(associated_class.table_name)
end