module AssociateJsonb::Reflection

Public Instance Methods

foreign_store?() click to toggle source
# File lib/associate_jsonb/reflection.rb, line 24
def foreign_store?
  options.key?(:foreign_store) && options[:foreign_store].present?
end
foreign_store_attr() click to toggle source
# File lib/associate_jsonb/reflection.rb, line 34
def foreign_store_attr
  options[:foreign_store]
end
foreign_store_key() click to toggle source
# File lib/associate_jsonb/reflection.rb, line 38
def foreign_store_key
  options[:foreign_store_key].presence || join_keys.key
end
foreign_store_key?(fk = nil) click to toggle source
# File lib/associate_jsonb/reflection.rb, line 28
def foreign_store_key?(fk = nil)
  options.key?(:foreign_store_key) \
  && options[:foreign_store_key].present? \
  && (!fk || (foreign_store_key.to_s != fk.to_s))
end
join_scope(table, foreign_table, foreign_klass) click to toggle source
Calls superclass method
# File lib/associate_jsonb/reflection.rb, line 42
def join_scope(table, foreign_table, foreign_klass)
  return super unless jsonb_store? || foreign_store?

  predicate_builder = predicate_builder(table)
  scope_chain_items = join_scopes(table, predicate_builder)
  klass_scope       = klass_join_scope(table, predicate_builder)

  if type
    klass_scope.where!(type => foreign_klass.polymorphic_name)
  end

  scope_chain_items.inject(klass_scope, &:merge!)

  key         = join_keys.key
  foreign_key = join_keys.foreign_key

  if foreign_store?
    klass_scope.where!(
      Arel::Nodes::NamedFunction.new(
        "CAST",
        [
          Arel::Nodes::Jsonb::DashDoubleArrow.
            new(table, table[foreign_store_attr], foreign_store_key || key).
            as(foreign_klass.columns_hash[foreign_key.to_s].sql_type)
        ]
      ).eq(
        ::Arel::Nodes::SqlLiteral.
          new("#{foreign_table.name}.#{foreign_key}")
      )
    )

    # klass_scope.where!(
    #   Arel::Nodes::Jsonb::DashDoubleArrow.
    #     new(table, table[foreign_store_attr], foreign_store_key || key).
    #     eq(
    #       ::Arel::Nodes::SqlLiteral.
    #         new("#{foreign_table.name}.#{foreign_key}::text")
    #     )
    # )
  elsif jsonb_store?
    klass_scope.where!(
      Arel::Nodes::NamedFunction.new(
        "CAST",
        [
          Arel::Nodes::Jsonb::DashDoubleArrow.
            new(foreign_table, foreign_table[jsonb_store_attr], jsonb_store_key || foreign_key).
            as(klass.columns_hash[key.to_s].sql_type)
        ]
      ).eq(
        ::Arel::Nodes::SqlLiteral.new("#{table.name}.#{key}")
      )
    )
  end

  if klass.finder_needs_type_condition?
    klass_scope.where!(klass.send(:type_condition, table))
  end

  klass_scope
end
jsonb_store?() click to toggle source
# File lib/associate_jsonb/reflection.rb, line 6
def jsonb_store?
  options.key?(:store) && jsonb_store_attr.present?
end
jsonb_store_attr() click to toggle source
# File lib/associate_jsonb/reflection.rb, line 16
def jsonb_store_attr
  options[:store]
end
jsonb_store_key() click to toggle source
# File lib/associate_jsonb/reflection.rb, line 20
def jsonb_store_key
  options[:store_key].presence || join_keys.foreign_key
end
jsonb_store_key?(fk = nil) click to toggle source
# File lib/associate_jsonb/reflection.rb, line 10
def jsonb_store_key?(fk = nil)
  options.key?(:store_key) \
  && options[:store_key].present? \
  && (!fk || (jsonb_store_key.to_s != fk.to_s))
end