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
969 def apply_eager_graph_limit_strategy(strategy, ds)
970   case strategy
971   when :correlated_subquery
972     apply_correlated_subquery_limit_strategy(ds)
973   else
974     super
975   end
976 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
979 def associated_object_keys
980   self[:keys]
981 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
985 def can_have_associated_objects?(obj)
986   !self[:primary_keys].any?{|k| obj.get_column_value(k).nil?}
987 end
cloneable?(ref) click to toggle source

one_to_many and one_to_one associations can be clones

    # File lib/sequel/model/associations.rb
990 def cloneable?(ref)
991   ref[:type] == :one_to_many || ref[:type] == :one_to_one
992 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
996 def default_key
997   :"#{underscore(demodulize(self[:model].name))}_id"
998 end
finalize_settings() click to toggle source
     # File lib/sequel/model/associations.rb
1003 def finalize_settings
1004   FINALIZE_SETTINGS
1005 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
1008 def handle_silent_modification_failure?
1009   self[:raise_on_save_failure] == false
1010 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
1013 def predicate_key
1014   cached_fetch(:predicate_key){qualify_assoc(self[:key])}
1015 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
1019 def primary_key
1020   self[:primary_key]
1021 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
1024 def qualified_primary_key
1025   cached_fetch(:qualified_primary_key){qualify_cur(primary_key)}
1026 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
1030 def reciprocal_array?
1031   false
1032 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
1035 def remove_before_destroy?
1036   false
1037 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
1040 def remove_should_check_existing?
1041   true
1042 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
1045 def set_reciprocal_to_self?
1046   true
1047 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
1054 def apply_correlated_subquery_limit_strategy(ds)
1055   table = ds.first_source_table
1056   table_alias = ds.first_source_alias
1057   primary_key = associated_class.primary_key
1058   key = self[:key]
1059   cs_alias = :t1
1060   cs = associated_dataset.
1061     from(Sequel.as(table, :t1)).
1062     select(*qualify(cs_alias, primary_key)).
1063     where(Array(qualify(cs_alias, key)).zip(Array(qualify(table_alias, key)))).
1064     limit(*limit_and_offset)
1065   ds.where(qualify(table_alias, primary_key)=>cs)
1066 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
1069 def apply_filter_by_associations_limit_strategy(ds)
1070   case filter_by_associations_limit_strategy
1071   when :correlated_subquery
1072     apply_correlated_subquery_limit_strategy(ds)
1073   else
1074     super
1075   end
1076 end
filter_by_associations_conditions_associated_keys() click to toggle source
     # File lib/sequel/model/associations.rb
1078 def filter_by_associations_conditions_associated_keys
1079   qualify(associated_class.table_name, self[:keys])
1080 end
filter_by_associations_conditions_key() click to toggle source
     # File lib/sequel/model/associations.rb
1082 def filter_by_associations_conditions_key
1083   qualify(self[:model].table_name, self[:primary_key_column])
1084 end
filter_by_associations_limit_alias_key() click to toggle source
     # File lib/sequel/model/associations.rb
1086 def filter_by_associations_limit_alias_key
1087   Array(filter_by_associations_limit_key)
1088 end
filter_by_associations_limit_aliases() click to toggle source
     # File lib/sequel/model/associations.rb
1090 def filter_by_associations_limit_aliases
1091   filter_by_associations_limit_alias_key.map(&:column)
1092 end
filter_by_associations_limit_key() click to toggle source
     # File lib/sequel/model/associations.rb
1094 def filter_by_associations_limit_key
1095   qualify(associated_class.table_name, associated_class.primary_key)
1096 end
predicate_key_methods() click to toggle source
     # File lib/sequel/model/associations.rb
1098 def predicate_key_methods
1099   self[:primary_keys]
1100 end
reciprocal_association?(assoc_reflect) click to toggle source
     # File lib/sequel/model/associations.rb
1102 def reciprocal_association?(assoc_reflect)
1103   super && self[:keys] == assoc_reflect[:keys] && primary_key == assoc_reflect.primary_key
1104 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
1107 def reciprocal_type
1108   :many_to_one
1109 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
1114 def true_eager_graph_limit_strategy
1115   r = super
1116   ds = associated_dataset
1117   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?)
1118     :correlated_subquery
1119   else
1120     r
1121   end
1122 end