Module: ActiveRecord::QueryMethods

Defined in:
lib/activerecord-multi-tenant/query_rewriter.rb

Instance Method Summary collapse

Instance Method Details

#build_arelObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 74

def build_arel
  arel = build_arel_orig

  if MultiTenant.current_tenant_id && !MultiTenant.with_write_only_mode_enabled?
    visitor = MultiTenant::ArelTenantVisitor.new(arel)
    visitor.tenant_relations.each do |statement_node_id, relations|
      # Process every level of the statement separately, so we don't mix subselects
      known_relations = visitor.existing_tenant_relations[statement_node_id] || []
      outer_joins_by_table_name = visitor.outer_joins_by_table_name[statement_node_id] || {}

      relations.each do |relation|
        model = MultiTenant.multi_tenant_model_for_table(relation.table_name)
        next unless model.present?
        next if known_relations.map(&:name).include?(relation.name)

        tenant_relation = known_relations.reject { |r| outer_joins_by_table_name.key?(r.name) }.first
        tenant_value = if tenant_relation.present?
                         known_model = MultiTenant.multi_tenant_model_for_table(tenant_relation.table_name)
                         tenant_relation[known_model.partition_key]
                       else
                         MultiTenant.current_tenant_id
                       end

        known_relations << relation

        outer_join = outer_joins_by_table_name[relation.name]
        if outer_join
          outer_join.right.expr = Arel::Nodes::And.new([outer_join.right.expr, relation[model.partition_key].eq(tenant_value)])
        else
          ctx = arel.ast.cores.last
          if ctx.wheres.size == 1
            ctx.wheres = [Arel::Nodes::And.new([ctx.wheres.first, relation[model.partition_key].eq(tenant_value)])]
          else
            arel = arel.where(relation[model.partition_key].eq(tenant_value))
          end
        end
      end
    end
  end

  arel
end

#build_arel_origObject



73
# File 'lib/activerecord-multi-tenant/query_rewriter.rb', line 73

alias :build_arel_orig :build_arel