Module: Torque::PostgreSQL::Reflection::AbstractReflection
- Defined in:
- lib/torque/postgresql/reflection/abstract_reflection.rb
Constant Summary collapse
- AREL_ATTR =
::Arel::Attributes::Attribute
- ARR_NO_CAST =
'bigint'.freeze
- ARR_CAST =
'bigint[]'.freeze
Instance Method Summary collapse
-
#build_id_constraint(klass_attr, source_attr) ⇒ Object
Build the id constraint checking if both types are perfect matching.
-
#build_join_constraint(table, foreign_table) ⇒ Object
Manually build the join constraint.
-
#connected_through_array? ⇒ Boolean
Check if the foreign key actually exists.
- #join_scope(table, foreign_table, foreign_klass) ⇒ Object
-
#torque_join_keys ⇒ Object
Monkey patching for rais 5.0.
Instance Method Details
#build_id_constraint(klass_attr, source_attr) ⇒ Object
Build the id constraint checking if both types are perfect matching
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/torque/postgresql/reflection/abstract_reflection.rb', line 49 def build_id_constraint(klass_attr, source_attr) return klass_attr.eq(source_attr) unless connected_through_array? # Klass and key are associated with the reflection Class klass_type = klass.columns_hash[torque_join_keys.key.to_s] # active_record and foreign_key are associated with the source Class source_type = active_record.columns_hash[torque_join_keys.foreign_key.to_s] # If both are attributes but the left side is not an array, and the # right side is, use the ANY operation any_operation = arel_array_to_any(klass_attr, source_attr, klass_type, source_type) return klass_attr.eq(any_operation) if any_operation # If the left side is not an array, just use the IN condition return klass_attr.in(source_attr) unless klass_type.try(:array) # Decide if should apply a cast to ensure same type comparision should_cast = klass_type.type.eql?(:integer) && source_type.type.eql?(:integer) should_cast &= !klass_type.sql_type.eql?(source_type.sql_type) should_cast |= !(klass_attr.is_a?(AREL_ATTR) && source_attr.is_a?(AREL_ATTR)) # Apply necessary transformations to values klass_attr = cast_constraint_to_array(klass_type, klass_attr, should_cast) source_attr = cast_constraint_to_array(source_type, source_attr, should_cast) # Return the overlap condition klass_attr.overlaps(source_attr) end |
#build_join_constraint(table, foreign_table) ⇒ Object
Manually build the join constraint
40 41 42 43 44 45 46 |
# File 'lib/torque/postgresql/reflection/abstract_reflection.rb', line 40 def build_join_constraint(table, foreign_table) result = build_id_constraint_between(table, foreign_table) result = table.create_and([result, klass.send(:type_condition, table)]) \ if klass.finder_needs_type_condition? result end |
#connected_through_array? ⇒ Boolean
Check if the foreign key actually exists
11 12 13 |
# File 'lib/torque/postgresql/reflection/abstract_reflection.rb', line 11 def connected_through_array? false end |
#join_scope(table, foreign_table, foreign_klass) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/torque/postgresql/reflection/abstract_reflection.rb', line 23 def join_scope(table, foreign_table, foreign_klass) return super unless connected_through_array? predicate_builder = predicate_builder(table) scope_chain_items = join_scopes(table, predicate_builder) klass_scope = klass_join_scope(table, predicate_builder) klass_scope.where!(build_id_constraint_between(table, foreign_table)) klass_scope.where!(type => foreign_klass.polymorphic_name) if type klass_scope.where!(klass.send(:type_condition, table)) \ if klass.finder_needs_type_condition? scope_chain_items.inject(klass_scope, &:merge!) end |
#torque_join_keys ⇒ Object
Monkey patching for rais 5.0
16 17 18 |
# File 'lib/torque/postgresql/reflection/abstract_reflection.rb', line 16 def torque_join_keys method(:join_keys).arity.eql?(0) ? join_keys : join_keys(klass) end |