Skip to content

Commit dbf398a

Browse files
committed
call the original delete_all method when the model does not support multi-tenancy
1 parent 3b21347 commit dbf398a

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

lib/activerecord-multi-tenant/relation_extension.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ module Arel
44
module ActiveRecordRelationExtension
55
# Overrides the delete_all method to include tenant scoping
66
def delete_all
7+
model = MultiTenant.multi_tenant_model_for_table(table_name)
8+
79
# Call the original delete_all method if the current tenant is identified by an ID
8-
return super if MultiTenant.current_tenant_is_id? || MultiTenant.current_tenant.nil?
10+
return super if model.nil? || MultiTenant.current_tenant_is_id? || MultiTenant.current_tenant.nil?
911

1012
stmt = Arel::DeleteManager.new.from(table)
1113
stmt.wheres = [generate_in_condition_subquery]
@@ -16,8 +18,10 @@ def delete_all
1618

1719
# Overrides the update_all method to include tenant scoping
1820
def update_all(updates)
21+
model = MultiTenant.multi_tenant_model_for_table(table_name)
22+
1923
# Call the original update_all method if the current tenant is identified by an ID
20-
return super if MultiTenant.current_tenant_is_id? || MultiTenant.current_tenant.nil?
24+
return super if model.nil? || MultiTenant.current_tenant_is_id? || MultiTenant.current_tenant.nil?
2125

2226
stmt = Arel::UpdateManager.new
2327
stmt.table(table)

spec/activerecord-multi-tenant/query_rewriter_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,38 @@
221221
end
222222
end
223223

224+
context 'when using non-multi-tenant model' do
225+
let!(:account1) { Account.create!(name: 'Test Account') }
226+
let!(:account2) { Account.create!(name: 'Test Account2') }
227+
let!(:unscoped1) { UnscopedModelWithAccount.create!(name: 'Model 1', account: account1) }
228+
let!(:unscoped2) { UnscopedModelWithAccount.create!(name: 'Model 2', account: account2) }
229+
230+
it 'updates records without tenant condition' do
231+
expect do
232+
MultiTenant.with(account1) do
233+
UnscopedModelWithAccount.update_all(name: 'Updated Name')
234+
end
235+
end.to change { unscoped1.reload.name }.from('Model 1').to('Updated Name')
236+
.and change { unscoped2.reload.name }.from('Model 2').to('Updated Name')
237+
238+
update_query = @queries.find { |q| q.include?('UPDATE "unscoped_model_with_accounts"') }
239+
expect(update_query).to be_present
240+
expect(update_query).not_to include('account_id')
241+
end
242+
243+
it 'deletes records without tenant condition' do
244+
expect do
245+
MultiTenant.with(account1) do
246+
UnscopedModelWithAccount.delete_all
247+
end
248+
end.to change { UnscopedModelWithAccount.count }.from(2).to(0)
249+
250+
delete_query = @queries.find { |q| q.include?('DELETE FROM "unscoped_model_with_accounts"') }
251+
expect(delete_query).to be_present
252+
expect(delete_query).not_to include('account_id')
253+
end
254+
end
255+
224256
context 'when update without arel' do
225257
it 'can call method' do
226258
expect do

spec/schema.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
t.column :name, :string
6464
end
6565

66+
create_table :unscoped_model_with_accounts, force: true do |t|
67+
t.references :account, :integer
68+
t.column :name, :string
69+
end
70+
6671
create_table :aliased_tasks, force: true, partition_key: :account_id do |t|
6772
t.column :account_id, :integer
6873
t.column :name, :string
@@ -208,6 +213,10 @@ class UnscopedModel < ActiveRecord::Base
208213
validates_uniqueness_of :name
209214
end
210215

216+
class UnscopedModelWithAccount < ActiveRecord::Base
217+
belongs_to :account
218+
end
219+
211220
class AliasedTask < ActiveRecord::Base
212221
multi_tenant :account
213222
belongs_to :project_alias, class_name: 'Project'

0 commit comments

Comments
 (0)