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
1022 def apply_eager_graph_limit_strategy(strategy, ds)
1023   case strategy
1024   when :correlated_subquery
1025     apply_correlated_subquery_limit_strategy(ds)
1026   else
1027     super
1028   end
1029 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
1032 def associated_object_keys
1033   self[:keys]
1034 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
1038 def can_have_associated_objects?(obj)
1039   !self[:primary_keys].any?{|k| obj.get_column_value(k).nil?}
1040 end
cloneable?(ref) click to toggle source

one_to_many and one_to_one associations can be clones

     # File lib/sequel/model/associations.rb
1043 def cloneable?(ref)
1044   ref[:type] == :one_to_many || ref[:type] == :one_to_one
1045 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
1049 def default_key
1050   :"#{underscore(demodulize(self[:model].name))}_id"
1051 end
finalize_settings() click to toggle source
     # File lib/sequel/model/associations.rb
1056 def finalize_settings
1057   FINALIZE_SETTINGS
1058 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
1061 def handle_silent_modification_failure?
1062   self[:raise_on_save_failure] == false
1063 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
1066 def predicate_key
1067   cached_fetch(:predicate_key){qualify_assoc(self[:key])}
1068 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
1072 def primary_key
1073   self[:primary_key]
1074 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
1077 def qualified_primary_key
1078   cached_fetch(:qualified_primary_key){qualify_cur(primary_key)}
1079 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
1083 def reciprocal_array?
1084   false
1085 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
1088 def remove_before_destroy?
1089   false
1090 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
1093 def remove_should_check_existing?
1094   true
1095 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
1098 def set_reciprocal_to_self?
1099   true
1100 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
1107 def apply_correlated_subquery_limit_strategy(ds)
1108   table = ds.first_source_table
1109   table_alias = ds.first_source_alias
1110   primary_key = associated_class.primary_key
1111   key = self[:key]
1112   cs_alias = :t1
1113   cs = associated_dataset.
1114     from(Sequel.as(table, :t1)).
1115     select(*qualify(cs_alias, primary_key)).
1116     where(Array(qualify(cs_alias, key)).zip(Array(qualify(table_alias, key)))).
1117     limit(*limit_and_offset)
1118   ds.where(qualify(table_alias, primary_key)=>cs)
1119 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
1122 def apply_filter_by_associations_limit_strategy(ds)
1123   case filter_by_associations_limit_strategy
1124   when :correlated_subquery
1125     apply_correlated_subquery_limit_strategy(ds)
1126   else
1127     super
1128   end
1129 end
filter_by_associations_conditions_associated_keys() click to toggle source
     # File lib/sequel/model/associations.rb
1131 def filter_by_associations_conditions_associated_keys
1132   qualify(associated_class.table_name, self[:keys])
1133 end
filter_by_associations_conditions_key() click to toggle source
     # File lib/sequel/model/associations.rb
1135 def filter_by_associations_conditions_key
1136   qualify(self[:model].table_name, self[:primary_key_column])
1137 end
filter_by_associations_limit_alias_key() click to toggle source
     # File lib/sequel/model/associations.rb
1139 def filter_by_associations_limit_alias_key
1140   Array(filter_by_associations_limit_key)
1141 end
filter_by_associations_limit_aliases() click to toggle source
     # File lib/sequel/model/associations.rb
1143 def filter_by_associations_limit_aliases
1144   filter_by_associations_limit_alias_key.map(&:column)
1145 end
filter_by_associations_limit_key() click to toggle source
     # File lib/sequel/model/associations.rb
1147 def filter_by_associations_limit_key
1148   qualify(associated_class.table_name, associated_class.primary_key)
1149 end
predicate_key_methods() click to toggle source
     # File lib/sequel/model/associations.rb
1151 def predicate_key_methods
1152   self[:primary_keys]
1153 end
reciprocal_association?(assoc_reflect) click to toggle source
     # File lib/sequel/model/associations.rb
1155 def reciprocal_association?(assoc_reflect)
1156   super && self[:keys] == assoc_reflect[:keys] && primary_key == assoc_reflect.primary_key
1157 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
1160 def reciprocal_type
1161   :many_to_one
1162 end
true_eager_graph_limit_strategy() click to toggle source

Support automatic use of correlated subqueries if :ruby option is best available option, the database supports them, 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
1167 def true_eager_graph_limit_strategy
1168   r = super
1169   ds = associated_dataset
1170   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?)
1171     :correlated_subquery
1172   else
1173     r
1174   end
1175 end