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|
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
|