File tree 3 files changed +47
-2
lines changed
lib/activerecord-multi-tenant
activerecord-multi-tenant
3 files changed +47
-2
lines changed Original file line number Diff line number Diff line change @@ -4,8 +4,10 @@ module Arel
4
4
module ActiveRecordRelationExtension
5
5
# Overrides the delete_all method to include tenant scoping
6
6
def delete_all
7
+ model = MultiTenant . multi_tenant_model_for_table ( table_name )
8
+
7
9
# 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?
9
11
10
12
stmt = Arel ::DeleteManager . new . from ( table )
11
13
stmt . wheres = [ generate_in_condition_subquery ]
@@ -16,8 +18,10 @@ def delete_all
16
18
17
19
# Overrides the update_all method to include tenant scoping
18
20
def update_all ( updates )
21
+ model = MultiTenant . multi_tenant_model_for_table ( table_name )
22
+
19
23
# 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?
21
25
22
26
stmt = Arel ::UpdateManager . new
23
27
stmt . table ( table )
Original file line number Diff line number Diff line change 221
221
end
222
222
end
223
223
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
+
224
256
context 'when update without arel' do
225
257
it 'can call method' do
226
258
expect do
Original file line number Diff line number Diff line change 63
63
t . column :name , :string
64
64
end
65
65
66
+ create_table :unscoped_model_with_accounts , force : true do |t |
67
+ t . references :account , :integer
68
+ t . column :name , :string
69
+ end
70
+
66
71
create_table :aliased_tasks , force : true , partition_key : :account_id do |t |
67
72
t . column :account_id , :integer
68
73
t . column :name , :string
@@ -208,6 +213,10 @@ class UnscopedModel < ActiveRecord::Base
208
213
validates_uniqueness_of :name
209
214
end
210
215
216
+ class UnscopedModelWithAccount < ActiveRecord ::Base
217
+ belongs_to :account
218
+ end
219
+
211
220
class AliasedTask < ActiveRecord ::Base
212
221
multi_tenant :account
213
222
belongs_to :project_alias , class_name : 'Project'
You can’t perform that action at this time.
0 commit comments