torque-postgresql 0.2.16 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.rdoc +76 -3
- data/lib/torque-postgresql.rb +1 -0
- data/lib/torque/postgresql.rb +6 -0
- data/lib/torque/postgresql/adapter.rb +2 -4
- data/lib/torque/postgresql/adapter/database_statements.rb +23 -9
- data/lib/torque/postgresql/adapter/oid.rb +12 -1
- data/lib/torque/postgresql/adapter/oid/box.rb +28 -0
- data/lib/torque/postgresql/adapter/oid/circle.rb +37 -0
- data/lib/torque/postgresql/adapter/oid/enum.rb +9 -5
- data/lib/torque/postgresql/adapter/oid/enum_set.rb +44 -0
- data/lib/torque/postgresql/adapter/oid/line.rb +59 -0
- data/lib/torque/postgresql/adapter/oid/range.rb +52 -0
- data/lib/torque/postgresql/adapter/oid/segment.rb +73 -0
- data/lib/torque/postgresql/adapter/quoting.rb +21 -0
- data/lib/torque/postgresql/adapter/schema_definitions.rb +7 -0
- data/lib/torque/postgresql/adapter/schema_dumper.rb +10 -1
- data/lib/torque/postgresql/arel.rb +3 -0
- data/lib/torque/postgresql/arel/infix_operation.rb +42 -0
- data/lib/torque/postgresql/arel/nodes.rb +32 -0
- data/lib/torque/postgresql/arel/operations.rb +18 -0
- data/lib/torque/postgresql/arel/visitors.rb +28 -2
- data/lib/torque/postgresql/associations.rb +8 -0
- data/lib/torque/postgresql/associations/association.rb +30 -0
- data/lib/torque/postgresql/associations/association_scope.rb +116 -0
- data/lib/torque/postgresql/associations/belongs_to_many_association.rb +117 -0
- data/lib/torque/postgresql/associations/builder.rb +2 -0
- data/lib/torque/postgresql/associations/builder/belongs_to_many.rb +121 -0
- data/lib/torque/postgresql/associations/builder/has_many.rb +15 -0
- data/lib/torque/postgresql/associations/join_dependency/join_association.rb +15 -0
- data/lib/torque/postgresql/associations/preloader.rb +25 -0
- data/lib/torque/postgresql/associations/preloader/association.rb +64 -0
- data/lib/torque/postgresql/attributes.rb +2 -0
- data/lib/torque/postgresql/attributes/builder.rb +1 -0
- data/lib/torque/postgresql/attributes/builder/enum.rb +23 -15
- data/lib/torque/postgresql/attributes/builder/period.rb +452 -0
- data/lib/torque/postgresql/attributes/enum.rb +11 -8
- data/lib/torque/postgresql/attributes/enum_set.rb +256 -0
- data/lib/torque/postgresql/attributes/lazy.rb +1 -1
- data/lib/torque/postgresql/attributes/period.rb +31 -0
- data/lib/torque/postgresql/attributes/type_map.rb +3 -5
- data/lib/torque/postgresql/autosave_association.rb +40 -0
- data/lib/torque/postgresql/auxiliary_statement.rb +201 -198
- data/lib/torque/postgresql/auxiliary_statement/settings.rb +20 -12
- data/lib/torque/postgresql/base.rb +161 -2
- data/lib/torque/postgresql/config.rb +91 -9
- data/lib/torque/postgresql/geometry_builder.rb +92 -0
- data/lib/torque/postgresql/i18n.rb +1 -1
- data/lib/torque/postgresql/railtie.rb +18 -5
- data/lib/torque/postgresql/reflection.rb +21 -0
- data/lib/torque/postgresql/reflection/abstract_reflection.rb +109 -0
- data/lib/torque/postgresql/reflection/association_reflection.rb +30 -0
- data/lib/torque/postgresql/reflection/belongs_to_many_reflection.rb +44 -0
- data/lib/torque/postgresql/reflection/has_many_reflection.rb +13 -0
- data/lib/torque/postgresql/reflection/runtime_reflection.rb +12 -0
- data/lib/torque/postgresql/reflection/through_reflection.rb +11 -0
- data/lib/torque/postgresql/relation.rb +11 -10
- data/lib/torque/postgresql/relation/auxiliary_statement.rb +11 -18
- data/lib/torque/postgresql/relation/inheritance.rb +2 -2
- data/lib/torque/postgresql/relation/merger.rb +11 -7
- data/lib/torque/postgresql/schema_cache.rb +1 -1
- data/lib/torque/postgresql/version.rb +1 -1
- data/lib/torque/range.rb +40 -0
- metadata +41 -9
@@ -3,7 +3,7 @@ module Torque
|
|
3
3
|
module I18n
|
4
4
|
|
5
5
|
# Adds extra suport to localize durations
|
6
|
-
# This is a temporary solution, since 3600.seconds
|
6
|
+
# This is a temporary solution, since 3600.seconds does not translate into
|
7
7
|
# 1 hour
|
8
8
|
def localize(locale, object, format = :default, options = {})
|
9
9
|
return super unless object.is_a?(ActiveSupport::Duration)
|
@@ -5,23 +5,36 @@ module Torque
|
|
5
5
|
|
6
6
|
# Get information from the running rails app
|
7
7
|
initializer 'torque-postgresql' do |app|
|
8
|
-
Torque::PostgreSQL.config
|
8
|
+
torque_config = Torque::PostgreSQL.config
|
9
|
+
torque_config.eager_load = app.config.eager_load
|
9
10
|
|
10
11
|
# Include enum on ActiveRecord::Base so it can have the correct enum
|
11
12
|
# initializer
|
12
13
|
Torque::PostgreSQL::Attributes::Enum.include_on(ActiveRecord::Base)
|
14
|
+
Torque::PostgreSQL::Attributes::EnumSet.include_on(ActiveRecord::Base)
|
15
|
+
Torque::PostgreSQL::Attributes::Period.include_on(ActiveRecord::Base)
|
13
16
|
|
14
|
-
#
|
15
|
-
|
17
|
+
# Setup belongs_to_many association
|
18
|
+
ActiveRecord::Base.belongs_to_many_required_by_default = torque_config.associations
|
19
|
+
.belongs_to_many_required_by_default
|
20
|
+
|
21
|
+
# Define a method to find enumaerators based on the namespace
|
22
|
+
torque_config.enum.namespace.define_singleton_method(:const_missing) do |name|
|
16
23
|
Torque::PostgreSQL::Attributes::Enum.lookup(name)
|
17
24
|
end
|
18
25
|
|
19
26
|
# Define a helper method to get a sample value
|
20
|
-
|
27
|
+
torque_config.enum.namespace.define_singleton_method(:sample) do |name|
|
21
28
|
Torque::PostgreSQL::Attributes::Enum.lookup(name).sample
|
22
29
|
end
|
23
|
-
end
|
24
30
|
|
31
|
+
# Define the exposed constant for auxiliary statements
|
32
|
+
if torque_config.auxiliary_statement.exposed_class.present?
|
33
|
+
*ns, name = torque_config.auxiliary_statement.exposed_class.split('::')
|
34
|
+
base = ns.present? ? Object.const_get(ns.join('::')) : Object
|
35
|
+
base.const_set(name, Torque::PostgreSQL::AuxiliaryStatement)
|
36
|
+
end
|
37
|
+
end
|
25
38
|
end
|
26
39
|
end
|
27
40
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'reflection/abstract_reflection'
|
2
|
+
require_relative 'reflection/association_reflection'
|
3
|
+
require_relative 'reflection/belongs_to_many_reflection'
|
4
|
+
require_relative 'reflection/has_many_reflection'
|
5
|
+
require_relative 'reflection/runtime_reflection'
|
6
|
+
require_relative 'reflection/through_reflection'
|
7
|
+
|
8
|
+
module Torque
|
9
|
+
module PostgreSQL
|
10
|
+
module Reflection
|
11
|
+
|
12
|
+
def create(macro, name, scope, options, ar)
|
13
|
+
return super unless macro.eql?(:belongs_to_many)
|
14
|
+
BelongsToManyReflection.new(name, scope, options, ar)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
::ActiveRecord::Reflection.singleton_class.prepend(Reflection)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module Reflection
|
4
|
+
module AbstractReflection
|
5
|
+
AREL_ATTR = ::Arel::Attributes::Attribute
|
6
|
+
|
7
|
+
ARR_NO_CAST = 'bigint'.freeze
|
8
|
+
ARR_CAST = 'bigint[]'.freeze
|
9
|
+
|
10
|
+
# Check if the foreign key actually exists
|
11
|
+
def connected_through_array?
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
# Monkey patching for rais 5.0
|
16
|
+
def torque_join_keys
|
17
|
+
method(:join_keys).arity.eql?(0) ? join_keys : join_keys(klass)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Manually build the join constraint
|
21
|
+
def build_join_constraint(table, foreign_table)
|
22
|
+
klass_attr = table[torque_join_keys.key]
|
23
|
+
source_attr = foreign_table[torque_join_keys.foreign_key]
|
24
|
+
|
25
|
+
result = build_id_constraint(klass_attr, source_attr)
|
26
|
+
result = table.create_and([result, klass.send(:type_condition, table)]) \
|
27
|
+
if klass.finder_needs_type_condition?
|
28
|
+
|
29
|
+
result
|
30
|
+
end
|
31
|
+
|
32
|
+
# Build the id constraint checking if both types are perfect matching
|
33
|
+
def build_id_constraint(klass_attr, source_attr)
|
34
|
+
return klass_attr.eq(source_attr) unless connected_through_array?
|
35
|
+
|
36
|
+
# Klass and key are associated with the reflection Class
|
37
|
+
klass_type = klass.columns_hash[torque_join_keys.key]
|
38
|
+
# active_record and foreign_key are associated with the source Class
|
39
|
+
source_type = active_record.columns_hash[torque_join_keys.foreign_key]
|
40
|
+
|
41
|
+
# If both are attributes but the left side is not an array, and the
|
42
|
+
# right side is, use the ANY operation
|
43
|
+
any_operation = arel_array_to_any(klass_attr, source_attr, klass_type, source_type)
|
44
|
+
return klass_attr.eq(any_operation) if any_operation
|
45
|
+
|
46
|
+
# If the left side is not an array, just use the IN condition
|
47
|
+
return klass_attr.in(source_attr) unless klass_type.try(:array)
|
48
|
+
|
49
|
+
# Decide if should apply a cast to ensure same type comparision
|
50
|
+
should_cast = klass_type.type.eql?(:integer) && source_type.type.eql?(:integer)
|
51
|
+
should_cast &= !klass_type.sql_type.eql?(source_type.sql_type)
|
52
|
+
should_cast |= !(klass_attr.is_a?(AREL_ATTR) && source_attr.is_a?(AREL_ATTR))
|
53
|
+
|
54
|
+
# Apply necessary transformations to values
|
55
|
+
klass_attr = cast_constraint_to_array(klass_type, klass_attr, should_cast)
|
56
|
+
source_attr = cast_constraint_to_array(source_type, source_attr, should_cast)
|
57
|
+
|
58
|
+
# Return the overlap condition
|
59
|
+
klass_attr.overlaps(source_attr)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Prepare a value for an array constraint overlap condition
|
65
|
+
def cast_constraint_to_array(type, value, should_cast)
|
66
|
+
base_ready = type.try(:array) && value.is_a?(AREL_ATTR)
|
67
|
+
return value if base_ready && (type.sql_type.eql?(ARR_NO_CAST) || !should_cast)
|
68
|
+
|
69
|
+
value = ::Arel::Nodes.build_quoted(Array.wrap(value)) unless base_ready
|
70
|
+
value = value.cast(ARR_CAST) if should_cast
|
71
|
+
value
|
72
|
+
end
|
73
|
+
|
74
|
+
# Check if it's possible to turn both attributes into an ANY condition
|
75
|
+
def arel_array_to_any(klass_attr, source_attr, klass_type, source_type)
|
76
|
+
return unless !klass_type.try(:array) && source_type.try(:array) &&
|
77
|
+
klass_attr.is_a?(AREL_ATTR) && source_attr.is_a?(AREL_ATTR)
|
78
|
+
|
79
|
+
::Arel::Nodes::NamedFunction.new('ANY', [source_attr])
|
80
|
+
end
|
81
|
+
|
82
|
+
# returns either +nil+ or the inverse association name that it finds.
|
83
|
+
def automatic_inverse_of
|
84
|
+
return super unless connected_through_array?
|
85
|
+
if can_find_inverse_of_automatically?(self)
|
86
|
+
inverse_name = options[:as] || active_record.name.demodulize
|
87
|
+
inverse_name = ActiveSupport::Inflector.underscore(inverse_name)
|
88
|
+
inverse_name = ActiveSupport::Inflector.pluralize(inverse_name)
|
89
|
+
inverse_name = inverse_name.to_sym
|
90
|
+
|
91
|
+
begin
|
92
|
+
reflection = klass._reflect_on_association(inverse_name)
|
93
|
+
rescue NameError
|
94
|
+
# Give up: we couldn't compute the klass type so we won't be able
|
95
|
+
# to find any associations either.
|
96
|
+
reflection = false
|
97
|
+
end
|
98
|
+
|
99
|
+
return inverse_name if reflection.connected_through_array? &&
|
100
|
+
valid_inverse_reflection?(reflection)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
::ActiveRecord::Reflection::AbstractReflection.prepend(AbstractReflection)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module Reflection
|
4
|
+
module AssociationReflection
|
5
|
+
|
6
|
+
def initialize(name, scope, options, active_record)
|
7
|
+
super
|
8
|
+
|
9
|
+
raise ArgumentError, <<-MSG.squish if options[:array] && options[:polymorphic]
|
10
|
+
Associations can't be connected through an array at the same time they are
|
11
|
+
polymorphic. Please choose one of the options.
|
12
|
+
MSG
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# Check if the foreign key should be pluralized
|
18
|
+
def derive_foreign_key
|
19
|
+
result = super
|
20
|
+
result = ActiveSupport::Inflector.pluralize(result) \
|
21
|
+
if collection? && connected_through_array?
|
22
|
+
result
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
::ActiveRecord::Reflection::AssociationReflection.prepend(AssociationReflection)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module Reflection
|
4
|
+
class BelongsToManyReflection < ::ActiveRecord::Reflection::AssociationReflection
|
5
|
+
def macro
|
6
|
+
:belongs_to_many
|
7
|
+
end
|
8
|
+
|
9
|
+
def connected_through_array?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def collection?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
def association_class
|
18
|
+
Associations::BelongsToManyAssociation
|
19
|
+
end
|
20
|
+
|
21
|
+
def association_foreign_key
|
22
|
+
@association_foreign_key ||= foreign_key
|
23
|
+
end
|
24
|
+
|
25
|
+
def active_record_primary_key
|
26
|
+
@active_record_primary_key ||= options[:primary_key] || derive_primary_key
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def derive_foreign_key
|
32
|
+
klass.primary_key
|
33
|
+
end
|
34
|
+
|
35
|
+
def derive_primary_key
|
36
|
+
ActiveSupport::Inflector.pluralize(klass.name.foreign_key)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
::ActiveRecord::Reflection::AssociationReflection::VALID_AUTOMATIC_INVERSE_MACROS.push(:belongs_to_many)
|
41
|
+
::ActiveRecord::Reflection.const_set(:BelongsToManyReflection, BelongsToManyReflection)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module Reflection
|
4
|
+
module RuntimeReflection
|
5
|
+
delegate :klass, :active_record, :connected_through_array?, :macro, :name,
|
6
|
+
:build_id_constraint, to: :@reflection
|
7
|
+
end
|
8
|
+
|
9
|
+
::ActiveRecord::Reflection::RuntimeReflection.include(RuntimeReflection)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Torque
|
2
|
+
module PostgreSQL
|
3
|
+
module Reflection
|
4
|
+
module ThroughReflection
|
5
|
+
delegate :build_id_constraint, :connected_through_array?, to: :source_reflection
|
6
|
+
end
|
7
|
+
|
8
|
+
::ActiveRecord::Reflection::ThroughReflection.include(ThroughReflection)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -14,9 +14,14 @@ module Torque
|
|
14
14
|
include Inheritance
|
15
15
|
|
16
16
|
SINGLE_VALUE_METHODS = [:itself_only]
|
17
|
-
MULTI_VALUE_METHODS = [:distinct_on, :auxiliary_statements, :cast_records]
|
17
|
+
MULTI_VALUE_METHODS = [:distinct_on, :auxiliary_statements, :cast_records, :select_extra]
|
18
18
|
VALUE_METHODS = SINGLE_VALUE_METHODS + MULTI_VALUE_METHODS
|
19
19
|
|
20
|
+
# :nodoc:
|
21
|
+
def select_extra_values; get_value(:select_extra); end
|
22
|
+
# :nodoc:
|
23
|
+
def select_extra_values=(value); set_value(:select_extra, value); end
|
24
|
+
|
20
25
|
# Resolve column name when calculating models, allowing the column name to
|
21
26
|
# be more complex while keeping the query selection quality
|
22
27
|
def calculate(operation, column_name)
|
@@ -41,7 +46,7 @@ module Torque
|
|
41
46
|
Array.wrap(list).map do |item|
|
42
47
|
case item
|
43
48
|
when String
|
44
|
-
::Arel
|
49
|
+
::Arel.sql(klass.send(:sanitize_sql, item.to_s))
|
45
50
|
when Symbol
|
46
51
|
base ? base.arel_attribute(item) : klass.arel_attribute(item)
|
47
52
|
when Array
|
@@ -72,13 +77,9 @@ module Torque
|
|
72
77
|
|
73
78
|
private
|
74
79
|
|
75
|
-
def dynamic_selection
|
76
|
-
@dynamic_selection ||= []
|
77
|
-
end
|
78
|
-
|
79
80
|
def build_arel(*)
|
80
81
|
arel = super
|
81
|
-
arel.project(*
|
82
|
+
arel.project(*select_extra_values) if select_values.blank?
|
82
83
|
arel
|
83
84
|
end
|
84
85
|
|
@@ -134,9 +135,9 @@ module Torque
|
|
134
135
|
warn_level = $VERBOSE
|
135
136
|
$VERBOSE = nil
|
136
137
|
|
137
|
-
ActiveRecord::Relation::SINGLE_VALUE_METHODS
|
138
|
-
ActiveRecord::Relation::MULTI_VALUE_METHODS
|
139
|
-
ActiveRecord::Relation::VALUE_METHODS
|
138
|
+
ActiveRecord::Relation::SINGLE_VALUE_METHODS += Relation::SINGLE_VALUE_METHODS
|
139
|
+
ActiveRecord::Relation::MULTI_VALUE_METHODS += Relation::MULTI_VALUE_METHODS
|
140
|
+
ActiveRecord::Relation::VALUE_METHODS += Relation::VALUE_METHODS
|
140
141
|
ActiveRecord::QueryMethods::VALID_UNSCOPING_VALUES += [:cast_records, :itself_only,
|
141
142
|
:distinct_on, :auxiliary_statements]
|
142
143
|
|
@@ -17,11 +17,11 @@ module Torque
|
|
17
17
|
def with!(*args)
|
18
18
|
options = args.extract_options!
|
19
19
|
args.each do |table|
|
20
|
-
instance = table.is_a?(PostgreSQL::AuxiliaryStatement
|
21
|
-
? table.
|
20
|
+
instance = table.is_a?(Class) && table < PostgreSQL::AuxiliaryStatement \
|
21
|
+
? table.new(options) \
|
22
22
|
: PostgreSQL::AuxiliaryStatement.instantiate(table, self, options)
|
23
|
-
|
24
|
-
self.auxiliary_statements_values
|
23
|
+
|
24
|
+
self.auxiliary_statements_values += [instance]
|
25
25
|
end
|
26
26
|
|
27
27
|
self
|
@@ -47,30 +47,23 @@ module Torque
|
|
47
47
|
|
48
48
|
# Hook arel build to add the distinct on clause
|
49
49
|
def build_arel(*)
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
subqueries = build_auxiliary_statements
|
51
|
+
return super if subqueries.nil?
|
52
|
+
super.with(subqueries)
|
53
53
|
end
|
54
54
|
|
55
55
|
# Build all necessary data for auxiliary statements
|
56
|
-
def build_auxiliary_statements
|
56
|
+
def build_auxiliary_statements
|
57
57
|
return unless self.auxiliary_statements_values.present?
|
58
|
-
|
59
|
-
|
60
|
-
subqueries = self.auxiliary_statements_values.map do |klass|
|
61
|
-
columns << klass.columns
|
62
|
-
klass.build_arel(arel, self)
|
58
|
+
self.auxiliary_statements_values.map do |klass|
|
59
|
+
klass.build(self)
|
63
60
|
end
|
64
|
-
|
65
|
-
columns.flatten!
|
66
|
-
arel.with(subqueries.flatten)
|
67
|
-
dynamic_selection.concat(columns) if columns.any?
|
68
61
|
end
|
69
62
|
|
70
63
|
# Throw an error showing that an auxiliary statement of the given
|
71
64
|
# table name isn't defined
|
72
65
|
def auxiliary_statement_error(name)
|
73
|
-
raise ArgumentError, <<-MSG.
|
66
|
+
raise ArgumentError, <<-MSG.squish
|
74
67
|
There's no '#{name}' auxiliary statement defined for #{self.class.name}.
|
75
68
|
MSG
|
76
69
|
end
|
@@ -76,7 +76,7 @@ module Torque
|
|
76
76
|
end
|
77
77
|
|
78
78
|
columns.push(build_auto_caster_marker(arel, self.cast_records_value))
|
79
|
-
|
79
|
+
self.select_extra_values += columns if columns.any?
|
80
80
|
end
|
81
81
|
|
82
82
|
# Build as many left outer join as necessary for each dependent table
|
@@ -106,7 +106,7 @@ module Torque
|
|
106
106
|
|
107
107
|
table = ::Arel::Table.new(type_attribute.camelize.underscore)
|
108
108
|
column = table[type_attribute].in(types)
|
109
|
-
::Arel
|
109
|
+
::Arel.sql(column.to_sql).as(auto_cast_attribute)
|
110
110
|
end
|
111
111
|
|
112
112
|
end
|
@@ -6,7 +6,7 @@ module Torque
|
|
6
6
|
def merge # :nodoc:
|
7
7
|
super
|
8
8
|
|
9
|
-
|
9
|
+
merge_select_extra
|
10
10
|
merge_distinct_on
|
11
11
|
merge_auxiliary_statements
|
12
12
|
merge_inheritance
|
@@ -16,9 +16,10 @@ module Torque
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
-
# Merge
|
20
|
-
def
|
21
|
-
relation.
|
19
|
+
# Merge extra select columns
|
20
|
+
def merge_select_extra
|
21
|
+
relation.select_extra_values.concat(other.select_extra_values).uniq! \
|
22
|
+
if other.select_extra_values.present?
|
22
23
|
end
|
23
24
|
|
24
25
|
# Merge distinct on columns
|
@@ -41,9 +42,12 @@ module Torque
|
|
41
42
|
|
42
43
|
# Merge settings related to inheritance tables
|
43
44
|
def merge_inheritance
|
44
|
-
relation.itself_only_value = true if other.itself_only_value
|
45
|
-
|
46
|
-
|
45
|
+
relation.itself_only_value = true if other.itself_only_value.present?
|
46
|
+
|
47
|
+
if other.cast_records_value.present?
|
48
|
+
relation.cast_records_value += other.cast_records_value
|
49
|
+
relation.cast_records_value.uniq!
|
50
|
+
end
|
47
51
|
end
|
48
52
|
|
49
53
|
end
|