sequel 4.43.0 → 4.44.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +40 -0
- data/doc/active_record.rdoc +2 -2
- data/doc/code_order.rdoc +15 -0
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/model_dataset_method_design.rdoc +132 -0
- data/doc/opening_databases.rdoc +2 -2
- data/doc/release_notes/4.44.0.txt +125 -0
- data/lib/sequel/adapters/jdbc.rb +5 -1
- data/lib/sequel/adapters/jdbc/as400.rb +1 -1
- data/lib/sequel/adapters/postgres.rb +23 -14
- data/lib/sequel/core.rb +1 -1
- data/lib/sequel/database/schema_generator.rb +27 -0
- data/lib/sequel/dataset/actions.rb +1 -1
- data/lib/sequel/dataset/query.rb +5 -1
- data/lib/sequel/extensions/eval_inspect.rb +4 -4
- data/lib/sequel/extensions/implicit_subquery.rb +48 -0
- data/lib/sequel/extensions/to_dot.rb +1 -1
- data/lib/sequel/model.rb +3 -5
- data/lib/sequel/model/associations.rb +107 -4
- data/lib/sequel/model/base.rb +98 -12
- data/lib/sequel/model/dataset_module.rb +1 -1
- data/lib/sequel/plugins/active_model.rb +11 -3
- data/lib/sequel/plugins/association_dependencies.rb +7 -0
- data/lib/sequel/plugins/auto_validations.rb +10 -0
- data/lib/sequel/plugins/blacklist_security.rb +13 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +11 -0
- data/lib/sequel/plugins/column_conflicts.rb +8 -0
- data/lib/sequel/plugins/composition.rb +12 -2
- data/lib/sequel/plugins/constraint_validations.rb +12 -0
- data/lib/sequel/plugins/csv_serializer.rb +9 -0
- data/lib/sequel/plugins/defaults_setter.rb +6 -0
- data/lib/sequel/plugins/force_encoding.rb +4 -3
- data/lib/sequel/plugins/hook_class_methods.rb +6 -0
- data/lib/sequel/plugins/input_transformer.rb +9 -0
- data/lib/sequel/plugins/insert_returning_select.rb +8 -0
- data/lib/sequel/plugins/instance_hooks.rb +4 -3
- data/lib/sequel/plugins/json_serializer.rb +9 -0
- data/lib/sequel/plugins/lazy_attributes.rb +7 -0
- data/lib/sequel/plugins/many_through_many.rb +13 -2
- data/lib/sequel/plugins/nested_attributes.rb +7 -0
- data/lib/sequel/plugins/pg_array_associations.rb +18 -2
- data/lib/sequel/plugins/pg_row.rb +3 -3
- data/lib/sequel/plugins/pg_typecast_on_load.rb +7 -0
- data/lib/sequel/plugins/prepared_statements.rb +2 -2
- data/lib/sequel/plugins/prepared_statements_safe.rb +7 -0
- data/lib/sequel/plugins/serialization.rb +9 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +13 -1
- data/lib/sequel/plugins/subclasses.rb +15 -1
- data/lib/sequel/plugins/touch.rb +7 -0
- data/lib/sequel/plugins/tree.rb +7 -0
- data/lib/sequel/plugins/typecast_on_load.rb +7 -0
- data/lib/sequel/plugins/update_refresh.rb +24 -13
- data/lib/sequel/plugins/validation_class_methods.rb +13 -0
- data/lib/sequel/sql.rb +28 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +18 -15
- data/spec/core/dataset_spec.rb +5 -0
- data/spec/core/expression_filters_spec.rb +33 -0
- data/spec/extensions/active_model_spec.rb +15 -1
- data/spec/extensions/association_dependencies_spec.rb +8 -0
- data/spec/extensions/auto_validations_spec.rb +8 -0
- data/spec/extensions/blacklist_security_spec.rb +6 -0
- data/spec/extensions/class_table_inheritance_spec.rb +9 -0
- data/spec/extensions/column_conflicts_spec.rb +6 -0
- data/spec/extensions/composition_spec.rb +8 -0
- data/spec/extensions/constraint_validations_plugin_spec.rb +12 -0
- data/spec/extensions/csv_serializer_spec.rb +7 -0
- data/spec/extensions/defaults_setter_spec.rb +7 -0
- data/spec/extensions/force_encoding_spec.rb +14 -0
- data/spec/extensions/hook_class_methods_spec.rb +10 -0
- data/spec/extensions/implicit_subquery_spec.rb +60 -0
- data/spec/extensions/input_transformer_spec.rb +10 -0
- data/spec/extensions/insert_returning_select_spec.rb +6 -0
- data/spec/extensions/json_serializer_spec.rb +7 -0
- data/spec/extensions/lazy_attributes_spec.rb +6 -0
- data/spec/extensions/many_through_many_spec.rb +44 -0
- data/spec/extensions/nested_attributes_spec.rb +5 -0
- data/spec/extensions/pg_array_associations_spec.rb +46 -0
- data/spec/extensions/pg_typecast_on_load_spec.rb +5 -0
- data/spec/extensions/prepared_statements_safe_spec.rb +5 -0
- data/spec/extensions/serialization_spec.rb +7 -0
- data/spec/extensions/single_table_inheritance_spec.rb +19 -2
- data/spec/extensions/subclasses_spec.rb +13 -0
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +6 -0
- data/spec/extensions/tree_spec.rb +6 -0
- data/spec/extensions/typecast_on_load_spec.rb +6 -0
- data/spec/extensions/update_refresh_spec.rb +7 -1
- data/spec/extensions/validation_class_methods_spec.rb +13 -0
- data/spec/model/association_reflection_spec.rb +177 -0
- data/spec/model/associations_spec.rb +16 -0
- data/spec/model/dataset_methods_spec.rb +59 -0
- data/spec/model/model_spec.rb +59 -0
- metadata +8 -2
@@ -39,7 +39,7 @@ module Sequel
|
|
39
39
|
end
|
40
40
|
|
41
41
|
meths = (<<-METHS).split.map(&:to_sym)
|
42
|
-
distinct grep group group_and_count group_append
|
42
|
+
distinct eager grep group group_and_count group_append
|
43
43
|
limit offset order order_append order_prepend
|
44
44
|
select select_all select_append select_group server
|
45
45
|
METHS
|
@@ -18,6 +18,9 @@ module Sequel
|
|
18
18
|
# # Make the Album class active_model compliant
|
19
19
|
# Album.plugin :active_model
|
20
20
|
module ActiveModel
|
21
|
+
# The default string to join composite primary keys with in to_param.
|
22
|
+
DEFAULT_TO_PARAM_JOINER = '-'.freeze
|
23
|
+
|
21
24
|
# ActiveModel compliant error class
|
22
25
|
class Errors < Sequel::Model::Errors
|
23
26
|
# Add autovivification so that #[] always returns an array.
|
@@ -28,6 +31,14 @@ module Sequel
|
|
28
31
|
|
29
32
|
module ClassMethods
|
30
33
|
include ::ActiveModel::Naming
|
34
|
+
|
35
|
+
# Cache model_name and to_partial path value before freezing.
|
36
|
+
def freeze
|
37
|
+
model_name
|
38
|
+
_to_partial_path
|
39
|
+
|
40
|
+
super
|
41
|
+
end
|
31
42
|
|
32
43
|
# Class level cache for to_partial_path.
|
33
44
|
def _to_partial_path
|
@@ -36,9 +47,6 @@ module Sequel
|
|
36
47
|
end
|
37
48
|
|
38
49
|
module InstanceMethods
|
39
|
-
# The default string to join composite primary keys with in to_param.
|
40
|
-
DEFAULT_TO_PARAM_JOINER = '-'.freeze
|
41
|
-
|
42
50
|
# Record that an object was destroyed, for later use by
|
43
51
|
# destroyed?
|
44
52
|
def after_destroy
|
@@ -73,6 +73,13 @@ module Sequel
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
# Freeze association dependencies when freezing model class.
|
77
|
+
def freeze
|
78
|
+
@association_dependencies.freeze.each_value(&:freeze)
|
79
|
+
|
80
|
+
super
|
81
|
+
end
|
82
|
+
|
76
83
|
Plugins.inherited_instance_variables(self, :@association_dependencies=>:hash_dup)
|
77
84
|
end
|
78
85
|
|
@@ -127,6 +127,16 @@ module Sequel
|
|
127
127
|
@auto_validate_types
|
128
128
|
end
|
129
129
|
|
130
|
+
# Freeze auto_validation settings when freezing model class.
|
131
|
+
def freeze
|
132
|
+
@auto_validate_not_null_columns.freeze
|
133
|
+
@auto_validate_explicit_not_null_columns.freeze
|
134
|
+
@auto_validate_max_length_columns.freeze
|
135
|
+
@auto_validate_unique_columns.freeze
|
136
|
+
|
137
|
+
super
|
138
|
+
end
|
139
|
+
|
130
140
|
# Skip automatic validations for the given validation type (:not_null, :types, :unique).
|
131
141
|
# If :all is given as the type, skip all auto validations.
|
132
142
|
def skip_auto_validations(type)
|
@@ -15,12 +15,25 @@ module Sequel
|
|
15
15
|
# # Make the Album class support the blacklist security features.
|
16
16
|
# Album.plugin :blacklist_security
|
17
17
|
module BlacklistSecurity
|
18
|
+
# Special array subclass used for marking methods to be removed.
|
19
|
+
class ExceptionList < Array
|
20
|
+
end
|
21
|
+
|
18
22
|
module ClassMethods
|
19
23
|
# Which columns are specifically restricted in a call to set/update/new/etc.
|
20
24
|
# (default: not set). Some columns are restricted regardless of
|
21
25
|
# this setting, such as the primary key column and columns in Model::RESTRICTED_SETTER_METHODS.
|
22
26
|
attr_reader :restricted_columns
|
23
27
|
|
28
|
+
Plugins.inherited_instance_variables(self, :@restricted_columns=>:dup)
|
29
|
+
|
30
|
+
# Freeze restricted columns when freezing model class.
|
31
|
+
def freeze
|
32
|
+
@restricted_columns.freeze
|
33
|
+
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
24
37
|
# Set the columns to restrict when using mass assignment (e.g. +set+). Using this means that
|
25
38
|
# attempts to call setter methods for the columns listed here will cause an
|
26
39
|
# exception or be silently skipped (based on the +strict_param_setting+ setting).
|
@@ -53,10 +66,6 @@ module Sequel
|
|
53
66
|
end
|
54
67
|
|
55
68
|
module InstanceMethods
|
56
|
-
# Special array subclass used for marking methods to be removed.
|
57
|
-
class ExceptionList < Array
|
58
|
-
end
|
59
|
-
|
60
69
|
# Set all values using the entries in the hash, except for the keys
|
61
70
|
# given in except. You should probably use +set_fields+ or +set_only+
|
62
71
|
# instead of this method, as blacklist approaches to security are a bad idea.
|
@@ -245,6 +245,17 @@ module Sequel
|
|
245
245
|
# Alias to sti_model_map, for backwards compatibility.
|
246
246
|
def cti_model_map; sti_model_map; end
|
247
247
|
|
248
|
+
# Freeze CTI information when freezing model class.
|
249
|
+
def freeze
|
250
|
+
@cti_models.freeze
|
251
|
+
@cti_tables.freeze
|
252
|
+
@cti_instance_dataset.freeze
|
253
|
+
@cti_table_columns.freeze
|
254
|
+
@cti_table_map.freeze
|
255
|
+
|
256
|
+
super
|
257
|
+
end
|
258
|
+
|
248
259
|
Plugins.inherited_instance_variables(self, :@cti_models=>nil, :@cti_tables=>nil, :@cti_table_columns=>nil, :@cti_instance_dataset=>nil, :@cti_table_map=>nil)
|
249
260
|
|
250
261
|
def inherited(subclass)
|
@@ -60,6 +60,14 @@ module Sequel
|
|
60
60
|
columns.find_all{|c| mod.method_defined?("#{c}=")}.each{|c| set_column_conflict!(c)}
|
61
61
|
end
|
62
62
|
|
63
|
+
# Freeze column conflict information when freezing model class.
|
64
|
+
def freeze
|
65
|
+
@get_column_conflicts.freeze
|
66
|
+
@set_column_conflicts.freeze
|
67
|
+
|
68
|
+
super
|
69
|
+
end
|
70
|
+
|
63
71
|
# Set the given column as one with a getter method conflict.
|
64
72
|
def get_column_conflict!(column)
|
65
73
|
@get_column_conflicts[column.to_sym] = @get_column_conflicts[column.to_s] = column.to_sym
|
@@ -58,7 +58,10 @@ module Sequel
|
|
58
58
|
module Composition
|
59
59
|
# Define the necessary class instance variables.
|
60
60
|
def self.apply(model)
|
61
|
-
model.instance_eval
|
61
|
+
model.instance_eval do
|
62
|
+
@compositions = {}
|
63
|
+
include(@composition_module ||= Module.new)
|
64
|
+
end
|
62
65
|
end
|
63
66
|
|
64
67
|
module ClassMethods
|
@@ -130,7 +133,6 @@ module Sequel
|
|
130
133
|
|
131
134
|
# Define getter and setter methods for the composition object.
|
132
135
|
def define_composition_accessor(name, opts=OPTS)
|
133
|
-
include(@composition_module ||= Module.new) unless composition_module
|
134
136
|
composer = opts[:composer]
|
135
137
|
composition_module.class_eval do
|
136
138
|
define_method(name) do
|
@@ -148,6 +150,14 @@ module Sequel
|
|
148
150
|
end
|
149
151
|
end
|
150
152
|
end
|
153
|
+
|
154
|
+
# Freeze composition information when freezing model class.
|
155
|
+
def freeze
|
156
|
+
compositions.freeze.each_value(&:freeze)
|
157
|
+
composition_module.freeze
|
158
|
+
|
159
|
+
super
|
160
|
+
end
|
151
161
|
end
|
152
162
|
|
153
163
|
module InstanceMethods
|
@@ -90,6 +90,18 @@ module Sequel
|
|
90
90
|
Plugins.inherited_instance_variables(self, :@constraint_validations_table=>nil, :@constraint_validation_options=>:hash_dup)
|
91
91
|
Plugins.after_set_dataset(self, :parse_constraint_validations)
|
92
92
|
|
93
|
+
# Freeze constraint validations data when freezing model class.
|
94
|
+
def freeze
|
95
|
+
@constraint_validations.freeze.each(&:freeze)
|
96
|
+
@constraint_validation_reflections.freeze.each_value do |v|
|
97
|
+
v.freeze
|
98
|
+
v.each(&:freeze)
|
99
|
+
end
|
100
|
+
@constraint_validation_options.freeze.each_value(&:freeze)
|
101
|
+
|
102
|
+
super
|
103
|
+
end
|
104
|
+
|
93
105
|
private
|
94
106
|
|
95
107
|
# If the database has not already parsed constraint validation
|
@@ -95,6 +95,15 @@ module Sequel
|
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
+
# Freeze csv serializier opts when freezing model class
|
99
|
+
def freeze
|
100
|
+
@csv_serializer_opts.freeze.each_value do |v|
|
101
|
+
v.freeze if v.is_a?(Array) || v.is_a?(Hash)
|
102
|
+
end
|
103
|
+
|
104
|
+
super
|
105
|
+
end
|
106
|
+
|
98
107
|
# Attempt to parse a single instance from the given CSV string
|
99
108
|
def from_csv(csv, opts = {})
|
100
109
|
new.from_csv(csv, opts)
|
@@ -36,6 +36,12 @@ module Sequel
|
|
36
36
|
|
37
37
|
Plugins.after_set_dataset(self, :set_default_values)
|
38
38
|
|
39
|
+
# Freeze default values when freezing model class
|
40
|
+
def freeze
|
41
|
+
@default_values.freeze
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
39
45
|
private
|
40
46
|
|
41
47
|
# Parse the cached database schema for this model and set the default values appropriately.
|
@@ -58,15 +58,16 @@ module Sequel
|
|
58
58
|
|
59
59
|
# Force the encoding for all string values in the given row hash.
|
60
60
|
def force_hash_encoding(row)
|
61
|
-
fe = model.forced_encoding
|
62
|
-
|
61
|
+
if fe = model.forced_encoding
|
62
|
+
row.each_value{|v| v.force_encoding(fe) if v.is_a?(String) && !v.is_a?(Sequel::SQL::Blob)}
|
63
|
+
end
|
63
64
|
row
|
64
65
|
end
|
65
66
|
|
66
67
|
# Force the encoding of all returned strings to the model's forced_encoding.
|
67
68
|
def typecast_value(column, value)
|
68
69
|
s = super
|
69
|
-
if s.is_a?(String) && (fe = model.forced_encoding)
|
70
|
+
if s.is_a?(String) && !s.is_a?(Sequel::SQL::Blob) && (fe = model.forced_encoding)
|
70
71
|
s = s.dup if s.frozen?
|
71
72
|
s.force_encoding(fe)
|
72
73
|
end
|
@@ -82,6 +82,12 @@ module Sequel
|
|
82
82
|
class_eval("def #{hook}; model.hook_blocks(:#{hook}){|b| return false if instance_eval(&b) == false}; end", __FILE__, __LINE__)
|
83
83
|
end
|
84
84
|
end
|
85
|
+
|
86
|
+
# Freeze hooks when freezing model class.
|
87
|
+
def freeze
|
88
|
+
@hooks.freeze.each_value(&:freeze)
|
89
|
+
super
|
90
|
+
end
|
85
91
|
|
86
92
|
# Returns true if there are any hook blocks for the given hook.
|
87
93
|
def has_hooks?(hook)
|
@@ -55,6 +55,15 @@ module Sequel
|
|
55
55
|
@skip_input_transformer_columns[transformer_name] = []
|
56
56
|
end
|
57
57
|
|
58
|
+
# Freeze input transformers when freezing model class
|
59
|
+
def freeze
|
60
|
+
@input_transformers.freeze
|
61
|
+
@input_transformer_order.freeze
|
62
|
+
@skip_input_transformer_columns.freeze.each_value(&:freeze)
|
63
|
+
|
64
|
+
super
|
65
|
+
end
|
66
|
+
|
58
67
|
# Set columns that the transformer should skip.
|
59
68
|
def skip_input_transformer(transformer_name, *columns)
|
60
69
|
@skip_input_transformer_columns[transformer_name].concat(columns).uniq!
|
@@ -30,6 +30,14 @@ module Sequel
|
|
30
30
|
# The dataset to use to insert new rows. For internal use only.
|
31
31
|
attr_reader :instance_insert_dataset
|
32
32
|
|
33
|
+
# Freeze instance insert dataset when freezing model class.
|
34
|
+
def freeze
|
35
|
+
super
|
36
|
+
|
37
|
+
@instance_insert_dataset.freeze if @instance_insert_dataset
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
33
41
|
private
|
34
42
|
|
35
43
|
# When reseting the instance dataset, also reset the instance_insert_dataset.
|
@@ -29,10 +29,11 @@ module Sequel
|
|
29
29
|
# # Add the instance hook methods just to Album instances
|
30
30
|
# Album.plugin :instance_hooks
|
31
31
|
module InstanceHooks
|
32
|
+
BEFORE_HOOKS = Sequel::Model::BEFORE_HOOKS
|
33
|
+
AFTER_HOOKS = Sequel::Model::AFTER_HOOKS
|
34
|
+
HOOKS = BEFORE_HOOKS + AFTER_HOOKS
|
35
|
+
|
32
36
|
module InstanceMethods
|
33
|
-
BEFORE_HOOKS = Sequel::Model::BEFORE_HOOKS
|
34
|
-
AFTER_HOOKS = Sequel::Model::AFTER_HOOKS
|
35
|
-
HOOKS = BEFORE_HOOKS + AFTER_HOOKS
|
36
37
|
HOOKS.each{|h| class_eval(<<-END , __FILE__, __LINE__+1)}
|
37
38
|
def #{h}_hook(&block)
|
38
39
|
raise Sequel::Error, "can't add hooks to frozen object" if frozen?
|
@@ -152,6 +152,15 @@ module Sequel
|
|
152
152
|
# The default opts to use when serializing model objects to JSON.
|
153
153
|
attr_reader :json_serializer_opts
|
154
154
|
|
155
|
+
# Freeze json serializier opts when freezing model class
|
156
|
+
def freeze
|
157
|
+
@json_serializer_opts.freeze.each_value do |v|
|
158
|
+
v.freeze if v.is_a?(Array) || v.is_a?(Hash)
|
159
|
+
end
|
160
|
+
|
161
|
+
super
|
162
|
+
end
|
163
|
+
|
155
164
|
# Attempt to parse a single instance from the given JSON string,
|
156
165
|
# with options passed to InstanceMethods#from_json_node.
|
157
166
|
def from_json(json, opts=OPTS)
|
@@ -42,6 +42,13 @@ module Sequel
|
|
42
42
|
# be overridden and call super to get the lazy attribute behavior
|
43
43
|
attr_accessor :lazy_attributes_module
|
44
44
|
|
45
|
+
# Freeze lazy attributes module when freezing model class.
|
46
|
+
def freeze
|
47
|
+
@lazy_attributes_module.freeze if @lazy_attributes_module
|
48
|
+
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
45
52
|
# Remove the given attributes from the list of columns selected by default.
|
46
53
|
# For each attribute given, create an accessor method that allows a lazy
|
47
54
|
# lookup of the attribute. Each attribute should be given as a symbol.
|
@@ -81,7 +81,7 @@ module Sequel
|
|
81
81
|
module ManyThroughMany
|
82
82
|
# The AssociationReflection subclass for many_through_many associations.
|
83
83
|
class ManyThroughManyAssociationReflection < Sequel::Model::Associations::ManyToManyAssociationReflection
|
84
|
-
Sequel::Model::Associations::ASSOCIATION_TYPES[:many_through_many] = self
|
84
|
+
Sequel.synchronize{Sequel::Model::Associations::ASSOCIATION_TYPES[:many_through_many] = self}
|
85
85
|
|
86
86
|
# many_through_many and one_through_many associations can be clones
|
87
87
|
def cloneable?(ref)
|
@@ -102,6 +102,17 @@ module Sequel
|
|
102
102
|
END
|
103
103
|
end
|
104
104
|
|
105
|
+
FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
|
106
|
+
:associated_key_table=>:associated_key_table,
|
107
|
+
:edges=>:edges,
|
108
|
+
:final_edge=>:final_edge,
|
109
|
+
:final_reverse_edge=>:final_reverse_edge,
|
110
|
+
:reverse_edges=>:reverse_edges
|
111
|
+
).freeze
|
112
|
+
def finalize_settings
|
113
|
+
FINALIZE_SETTINGS
|
114
|
+
end
|
115
|
+
|
105
116
|
# The alias for the first join table.
|
106
117
|
def join_table_alias
|
107
118
|
final_reverse_edge[:alias]
|
@@ -181,7 +192,7 @@ module Sequel
|
|
181
192
|
end
|
182
193
|
|
183
194
|
class OneThroughManyAssociationReflection < ManyThroughManyAssociationReflection
|
184
|
-
Sequel::Model::Associations::ASSOCIATION_TYPES[:one_through_many] = self
|
195
|
+
Sequel.synchronize{Sequel::Model::Associations::ASSOCIATION_TYPES[:one_through_many] = self}
|
185
196
|
include Sequel::Model::Associations::SingularAssociationReflection
|
186
197
|
end
|
187
198
|
|
@@ -85,6 +85,13 @@ module Sequel
|
|
85
85
|
# call be overridden and call super to get the default behavior
|
86
86
|
attr_accessor :nested_attributes_module
|
87
87
|
|
88
|
+
# Freeze nested_attributes_module when freezing model class.
|
89
|
+
def freeze
|
90
|
+
@nested_attributes_module.freeze if @nested_attributes_module
|
91
|
+
|
92
|
+
super
|
93
|
+
end
|
94
|
+
|
88
95
|
# Allow nested attributes to be set for the given associations. Options:
|
89
96
|
# :destroy :: Allow destruction of nested records.
|
90
97
|
# :fields :: If provided, should be an Array or proc. If it is an array,
|
@@ -75,7 +75,7 @@ module Sequel
|
|
75
75
|
module PgArrayAssociations
|
76
76
|
# The AssociationReflection subclass for many_to_pg_array associations.
|
77
77
|
class ManyToPgArrayAssociationReflection < Sequel::Model::Associations::AssociationReflection
|
78
|
-
Sequel::Model::Associations::ASSOCIATION_TYPES[:many_to_pg_array] = self
|
78
|
+
Sequel.synchronize{Sequel::Model::Associations::ASSOCIATION_TYPES[:many_to_pg_array] = self}
|
79
79
|
|
80
80
|
def array_type
|
81
81
|
cached_fetch(:array_type) do
|
@@ -122,6 +122,13 @@ module Sequel
|
|
122
122
|
nil
|
123
123
|
end
|
124
124
|
|
125
|
+
FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
|
126
|
+
:array_type=>:array_type
|
127
|
+
).freeze
|
128
|
+
def finalize_settings
|
129
|
+
FINALIZE_SETTINGS
|
130
|
+
end
|
131
|
+
|
125
132
|
# Handle silent failure of add/remove methods if raise_on_save_failure is false.
|
126
133
|
def handle_silent_modification_failure?
|
127
134
|
self[:raise_on_save_failure] == false
|
@@ -177,7 +184,7 @@ module Sequel
|
|
177
184
|
|
178
185
|
# The AssociationReflection subclass for pg_array_to_many associations.
|
179
186
|
class PgArrayToManyAssociationReflection < Sequel::Model::Associations::AssociationReflection
|
180
|
-
Sequel::Model::Associations::ASSOCIATION_TYPES[:pg_array_to_many] = self
|
187
|
+
Sequel.synchronize{Sequel::Model::Associations::ASSOCIATION_TYPES[:pg_array_to_many] = self}
|
181
188
|
|
182
189
|
def array_type
|
183
190
|
cached_fetch(:array_type) do
|
@@ -229,6 +236,15 @@ module Sequel
|
|
229
236
|
nil
|
230
237
|
end
|
231
238
|
|
239
|
+
FINALIZE_SETTINGS = superclass::FINALIZE_SETTINGS.merge(
|
240
|
+
:array_type=>:array_type,
|
241
|
+
:primary_key=>:primary_key,
|
242
|
+
:primary_key_method=>:primary_key_method
|
243
|
+
).freeze
|
244
|
+
def finalize_settings
|
245
|
+
FINALIZE_SETTINGS
|
246
|
+
end
|
247
|
+
|
232
248
|
# Handle silent failure of add/remove methods if raise_on_save_failure is false
|
233
249
|
# and save_after_modify is true.
|
234
250
|
def handle_silent_modification_failure?
|
@@ -52,6 +52,9 @@ module Sequel
|
|
52
52
|
# DB[:company].insert(:name=>'MS', :address=>
|
53
53
|
# Address.load(:street=>'123 Foo St', :city=>'Bar Town', :zip=>'12345'))
|
54
54
|
module PgRow
|
55
|
+
ROW = 'ROW'.freeze
|
56
|
+
CAST = '::'.freeze
|
57
|
+
|
55
58
|
# When loading the extension, make sure the database has the pg_row extension
|
56
59
|
# loaded, load the custom database extensions, and automatically register the
|
57
60
|
# row type if the model has a dataset.
|
@@ -70,9 +73,6 @@ module Sequel
|
|
70
73
|
end
|
71
74
|
|
72
75
|
module InstanceMethods
|
73
|
-
ROW = 'ROW'.freeze
|
74
|
-
CAST = '::'.freeze
|
75
|
-
|
76
76
|
# Literalize the model instance and append it to the sql.
|
77
77
|
def sql_literal_append(ds, sql)
|
78
78
|
sql << ROW
|