class Sequel::Model::Associations::OneToManyAssociationReflection

Constants

FINALIZE_SETTINGS

Public Instance Methods

apply_eager_graph_limit_strategy(strategy, ds) click to toggle source

Support a correlated subquery limit strategy when using eager_graph.

# File lib/sequel/model/associations.rb, line 966
def apply_eager_graph_limit_strategy(strategy, ds)
  case strategy
  when :correlated_subquery
    apply_correlated_subquery_limit_strategy(ds)
  else
    super
  end
end
associated_object_keys() click to toggle source

The keys in the associated model's table related to this association

# File lib/sequel/model/associations.rb, line 976
def associated_object_keys
  self[:keys]
end
can_have_associated_objects?(obj) click to toggle source

one_to_many associations can only have associated objects if none of the :keys options have a nil value.

# File lib/sequel/model/associations.rb, line 982
def can_have_associated_objects?(obj)
  !self[:primary_keys].any?{|k| obj.get_column_value(k).nil?}
end
cloneable?(ref) click to toggle source

one_to_many and one_to_one associations can be clones

# File lib/sequel/model/associations.rb, line 987
def cloneable?(ref)
  ref[:type] == :one_to_many || ref[:type] == :one_to_one
end
default_key() click to toggle source

Default foreign key name symbol for key in associated table that points to current table's primary key.

# File lib/sequel/model/associations.rb, line 993
def default_key
  :"#{underscore(demodulize(self[:model].name))}_id"
end
finalize_settings() click to toggle source
# File lib/sequel/model/associations.rb, line 1000
def finalize_settings
  FINALIZE_SETTINGS
end
handle_silent_modification_failure?() click to toggle source

Handle silent failure of add/remove methods if raise_on_save_failure is false.

# File lib/sequel/model/associations.rb, line 1005
def handle_silent_modification_failure?
  self[:raise_on_save_failure] == false
end
predicate_key() click to toggle source

The hash key to use for the eager loading predicate (left side of IN (1, 2, 3))

# File lib/sequel/model/associations.rb, line 1010
def predicate_key
  cached_fetch(:predicate_key){qualify_assoc(self[:key])}
end
Also aliased as: qualified_key
primary_key() click to toggle source

The column in the current table that the key in the associated table references.

# File lib/sequel/model/associations.rb, line 1016
def primary_key
  self[:primary_key]
end
qualified_key()
Alias for: predicate_key
qualified_primary_key() click to toggle source

#primary_key qualified by the current table

# File lib/sequel/model/associations.rb, line 1021
def qualified_primary_key
  cached_fetch(:qualified_primary_key){qualify_cur(primary_key)}
end
reciprocal_array?() click to toggle source

Whether the reciprocal of this association returns an array of objects instead of a single object, false for a one_to_many association.

# File lib/sequel/model/associations.rb, line 1027
def reciprocal_array?
  false
end
remove_before_destroy?() click to toggle source

Destroying one_to_many associated objects automatically deletes the foreign key.

# File lib/sequel/model/associations.rb, line 1032
def remove_before_destroy?
  false
end
remove_should_check_existing?() click to toggle source

The one_to_many association needs to check that an object to be removed already is associated.

# File lib/sequel/model/associations.rb, line 1037
def remove_should_check_existing?
  true
end
set_reciprocal_to_self?() click to toggle source

One to many associations set the reciprocal to self when loading associated records.

# File lib/sequel/model/associations.rb, line 1042
def set_reciprocal_to_self?
  true
end

Private Instance Methods

apply_correlated_subquery_limit_strategy(ds) click to toggle source

Use a correlated subquery to limit the dataset. Note that this will not work correctly if the associated dataset uses qualified identifers in the WHERE clause, as they would reference the containing query instead of the subquery.

# File lib/sequel/model/associations.rb, line 1051
def apply_correlated_subquery_limit_strategy(ds)
  table = ds.first_source_table
  table_alias = ds.first_source_alias
  primary_key = associated_class.primary_key
  key = self[:key]
  cs_alias = :t1
  cs = associated_dataset.
    from(Sequel.as(table, :t1)).
    select(*qualify(cs_alias, primary_key)).
    where(Array(qualify(cs_alias, key)).zip(Array(qualify(table_alias, key)))).
    limit(*limit_and_offset)
  ds.where(qualify(table_alias, primary_key)=>cs)
end
apply_filter_by_associations_limit_strategy(ds) click to toggle source

Support correlated subquery strategy when filtering by limited associations.

# File lib/sequel/model/associations.rb, line 1066
def apply_filter_by_associations_limit_strategy(ds)
  case filter_by_associations_limit_strategy
  when :correlated_subquery
    apply_correlated_subquery_limit_strategy(ds)
  else
    super
  end
end
filter_by_associations_conditions_associated_keys() click to toggle source
# File lib/sequel/model/associations.rb, line 1075
def filter_by_associations_conditions_associated_keys
  qualify(associated_class.table_name, self[:keys])
end
filter_by_associations_conditions_key() click to toggle source
# File lib/sequel/model/associations.rb, line 1079
def filter_by_associations_conditions_key
  qualify(self[:model].table_name, self[:primary_key_column])
end
filter_by_associations_limit_alias_key() click to toggle source
# File lib/sequel/model/associations.rb, line 1083
def filter_by_associations_limit_alias_key
  Array(filter_by_associations_limit_key)
end
filter_by_associations_limit_aliases() click to toggle source
# File lib/sequel/model/associations.rb, line 1087
def filter_by_associations_limit_aliases
  filter_by_associations_limit_alias_key.map(&:column)
end
filter_by_associations_limit_key() click to toggle source
# File lib/sequel/model/associations.rb, line 1091
def filter_by_associations_limit_key
  qualify(associated_class.table_name, associated_class.primary_key)
end
predicate_key_methods() click to toggle source
# File lib/sequel/model/associations.rb, line 1095
def predicate_key_methods
  self[:primary_keys]
end
reciprocal_association?(assoc_reflect) click to toggle source
# File lib/sequel/model/associations.rb, line 1099
def reciprocal_association?(assoc_reflect)
  super && self[:keys] == assoc_reflect[:keys] && primary_key == assoc_reflect.primary_key
end
reciprocal_type() click to toggle source

The reciprocal type of a one_to_many association is a many_to_one association.

# File lib/sequel/model/associations.rb, line 1104
def reciprocal_type
  :many_to_one
end
true_eager_graph_limit_strategy() click to toggle source

Support automatic use of correlated subqueries if :ruby option is best available option, MySQL is not being used, and either the associated class has a non-composite primary key or the database supports multiple columns in IN.

# File lib/sequel/model/associations.rb, line 1111
def true_eager_graph_limit_strategy
  r = super
  ds = associated_dataset
  if r == :ruby && ds.supports_limits_in_correlated_subqueries? && (Array(associated_class.primary_key).length == 1 || ds.supports_multiple_column_in?) && (!offset || ds.supports_offsets_in_correlated_subqueries?)
    :correlated_subquery
  else
    r
  end
end