activerecord-multi-tenant 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/lib/activerecord-multi-tenant.rb +1 -0
- data/lib/activerecord-multi-tenant/default_scope.rb +3 -1
- data/lib/activerecord-multi-tenant/multi_tenant.rb +5 -0
- data/lib/activerecord-multi-tenant/referential_integrity.rb +2 -2
- data/lib/activerecord-multi-tenant/version.rb +1 -1
- data/lib/activerecord-multi-tenant/with_lock.rb +17 -0
- data/spec/activerecord-multi-tenant/model_extensions_spec.rb +23 -0
- data/spec/spec_helper.rb +3 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0692994e7b629c802155cdf7314b1b9178ec8897
|
4
|
+
data.tar.gz: 07e223afb891884df3e0f5cdf5b4d17149eb76fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da7f603099dab7a4c87492e26d4e602c7f11eb5cdd93bed4d9e8573b437cffd178e9380759d1e8934e28e87369fa0d7baca723dafd73202e2cf712f7128279c4
|
7
|
+
data.tar.gz: d51a45f8c081e5d9385c7a5e248efe398337028f497db8c8220cd56b096da9369e23e134a116d3f3fb0cada2e412dc52da24b0cc3688a3da98c6b738be4c9cb5
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.3.2 2017-02-16
|
4
|
+
|
5
|
+
* Support blocks passed into the unscoped method (this fixes reload, amongst other issues)
|
6
|
+
* Make with_lock work by adding workaround for Citus #1236 (SELECT ... FOR UPDATE is not router-plannable)
|
7
|
+
|
8
|
+
|
3
9
|
## 0.3.1 2017-02-13
|
4
10
|
|
5
11
|
* Rails 5 API controller support [@mstahl](https://github.com/mstahl) [#4](https://github.com/citusdata/activerecord-multi-tenant/pull/4)
|
data/Gemfile.lock
CHANGED
@@ -2,11 +2,13 @@ class ActiveRecord::Base
|
|
2
2
|
class << self
|
3
3
|
alias :unscoped_orig :unscoped
|
4
4
|
def unscoped
|
5
|
-
if respond_to?(:scoped_by_tenant?) && MultiTenant.current_tenant_id
|
5
|
+
scope = if respond_to?(:scoped_by_tenant?) && MultiTenant.current_tenant_id
|
6
6
|
unscoped_orig.where(arel_table[self.partition_key].eq(MultiTenant.current_tenant_id))
|
7
7
|
else
|
8
8
|
unscoped_orig
|
9
9
|
end
|
10
|
+
|
11
|
+
block_given? ? scope.scoping { yield } : scope
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
@@ -15,6 +15,11 @@ module MultiTenant
|
|
15
15
|
"#{@@tenant_klass.to_s}_id"
|
16
16
|
end
|
17
17
|
|
18
|
+
# Workaroud to make "with_lock" work until https://github.com/citusdata/citus/issues/1236 is fixed
|
19
|
+
@@enable_with_lock_workaround = false
|
20
|
+
def self.enable_with_lock_workaround; @@enable_with_lock_workaround = true; end
|
21
|
+
def self.with_lock_workaround_enabled?; @@enable_with_lock_workaround; end
|
22
|
+
|
18
23
|
def self.current_tenant=(tenant)
|
19
24
|
RequestStore.store[:current_tenant] = tenant
|
20
25
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
# DISABLE TRIGGER
|
1
|
+
# Workaround for https://github.com/citusdata/citus/issues/1080
|
2
|
+
# "Support DISABLE/ENABLE TRIGGER ALL on distributed tables"
|
3
3
|
|
4
4
|
module ActiveRecord
|
5
5
|
module ConnectionAdapters
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Workaround for https://github.com/citusdata/citus/issues/1236
|
2
|
+
# "SELECT ... FOR UPDATE is not supported for router-plannable queries"
|
3
|
+
|
4
|
+
class ActiveRecord::Base
|
5
|
+
alias :with_lock_orig :with_lock
|
6
|
+
def with_lock(&block)
|
7
|
+
if self.class.respond_to?(:scoped_by_tenant?) && MultiTenant.current_tenant_id && MultiTenant.with_lock_workaround_enabled?
|
8
|
+
transaction do
|
9
|
+
self.class.unscoped.where(id: id).update_all(id: id) # No-op UPDATE that locks the row
|
10
|
+
reload # This is just to act similar to the default Rails approach, in case someone relies on the reload
|
11
|
+
yield
|
12
|
+
end
|
13
|
+
else
|
14
|
+
with_lock_orig(&block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -149,5 +149,28 @@ describe MultiTenant do
|
|
149
149
|
|
150
150
|
expect(value).to eq "something"
|
151
151
|
end
|
152
|
+
|
153
|
+
it 'supports reload inside the block' do
|
154
|
+
@account = Account.create!(name: 'foo')
|
155
|
+
|
156
|
+
MultiTenant.with @account do
|
157
|
+
project = @account.projects.create!(name: 'project')
|
158
|
+
project.reload
|
159
|
+
expect(project.name).to eq 'project'
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe '.with_lock' do
|
165
|
+
it 'supports with_lock blocks inside the block' do
|
166
|
+
@account = Account.create!(name: 'foo')
|
167
|
+
|
168
|
+
MultiTenant.with @account do
|
169
|
+
project = @account.projects.create!(name: 'project')
|
170
|
+
project.with_lock do
|
171
|
+
expect(project.name).to eq 'project'
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
152
175
|
end
|
153
176
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -23,6 +23,9 @@ RSpec.configure do |config|
|
|
23
23
|
config.before(:suite) do
|
24
24
|
DatabaseCleaner[:active_record].strategy = :transaction
|
25
25
|
DatabaseCleaner[:active_record].clean_with(:truncation)
|
26
|
+
|
27
|
+
# Keep this here until https://github.com/citusdata/citus/issues/1236 is fixed in a patch release we can run tests with
|
28
|
+
MultiTenant.enable_with_lock_workaround
|
26
29
|
end
|
27
30
|
|
28
31
|
config.before(:each) do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-multi-tenant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Citus Data
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: request_store
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- lib/activerecord-multi-tenant/multi_tenant.rb
|
153
153
|
- lib/activerecord-multi-tenant/referential_integrity.rb
|
154
154
|
- lib/activerecord-multi-tenant/version.rb
|
155
|
+
- lib/activerecord-multi-tenant/with_lock.rb
|
155
156
|
- spec/activerecord-multi-tenant/controller_extensions_spec.rb
|
156
157
|
- spec/activerecord-multi-tenant/model_extensions_spec.rb
|
157
158
|
- spec/activerecord-multi-tenant/record_callback_spec.rb
|