Skip to content

Commit bad0fc1

Browse files
committed
Wait for ActiveRecord to be fully loaded before adding models
1 parent 90372a0 commit bad0fc1

File tree

2 files changed

+54
-43
lines changed

2 files changed

+54
-43
lines changed

lib/flipper/adapters/active_record.rb

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,36 @@ module Adapters
77
class ActiveRecord
88
include ::Flipper::Adapter
99

10-
# Abstract base class for internal models
11-
class Model < ::ActiveRecord::Base
12-
self.abstract_class = true
13-
end
10+
ActiveSupport.on_load(:active_record) do
11+
# Abstract base class for internal models
12+
class Model < ::ActiveRecord::Base
13+
self.abstract_class = true
14+
end
1415

15-
# Private: Do not use outside of this adapter.
16-
class Feature < Model
17-
self.table_name = [
18-
Model.table_name_prefix,
19-
"flipper_features",
20-
Model.table_name_suffix,
21-
].join
16+
# Private: Do not use outside of this adapter.
17+
class Feature < Model
18+
self.table_name = [
19+
Model.table_name_prefix,
20+
"flipper_features",
21+
Model.table_name_suffix,
22+
].join
2223

23-
has_many :gates, foreign_key: "feature_key", primary_key: "key"
24+
has_many :gates, foreign_key: "feature_key", primary_key: "key"
2425

25-
validates :key, presence: true
26-
end
26+
validates :key, presence: true
27+
end
2728

28-
# Private: Do not use outside of this adapter.
29-
class Gate < Model
30-
self.table_name = [
31-
Model.table_name_prefix,
32-
"flipper_gates",
33-
Model.table_name_suffix,
34-
].join
29+
# Private: Do not use outside of this adapter.
30+
class Gate < Model
31+
self.table_name = [
32+
Model.table_name_prefix,
33+
"flipper_gates",
34+
Model.table_name_suffix,
35+
].join
3536

36-
validates :feature_key, presence: true
37-
validates :key, presence: true
37+
validates :feature_key, presence: true
38+
validates :key, presence: true
39+
end
3840
end
3941

4042
VALUE_TO_TEXT_WARNING = <<-EOS

spec/flipper/adapters/active_record_spec.rb

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,19 @@
3939
}
4040
].each do |config|
4141
context "with #{config['adapter']}" do
42-
context "with tables created" do
43-
before(:all) do
44-
skip_on_error(ActiveRecord::ConnectionNotEstablished, "#{config['adapter']} not available") do
45-
silence { ActiveRecord::Tasks::DatabaseTasks.create(config) }
46-
end
47-
48-
Flipper.configuration = nil
42+
before(:all) do
43+
skip_on_error(ActiveRecord::ConnectionNotEstablished, "#{config['adapter']} not available") do
44+
silence { ActiveRecord::Tasks::DatabaseTasks.create(config) }
4945
end
5046

47+
Flipper.configuration = nil
48+
end
49+
50+
after(:all) do
51+
silence { ActiveRecord::Tasks::DatabaseTasks.drop(config) } unless $skip
52+
end
53+
54+
context "with tables created" do
5155
before(:each) do
5256
skip_on_error(ActiveRecord::ConnectionNotEstablished, "#{config['adapter']} not available") do
5357
ActiveRecord::Base.establish_connection(config)
@@ -60,10 +64,6 @@
6064
ActiveRecord::Base.connection.close
6165
end
6266

63-
after(:all) do
64-
silence { ActiveRecord::Tasks::DatabaseTasks.drop(config) } unless $skip
65-
end
66-
6767
it_should_behave_like 'a flipper adapter'
6868

6969
it "should load actor ids fine" do
@@ -215,18 +215,27 @@
215215
end
216216
end
217217

218-
it "works when table doesn't exist" do
218+
context "without tables created" do
219+
before(:each) do
220+
skip_on_error(ActiveRecord::ConnectionNotEstablished, "#{config['adapter']} not available") do
221+
ActiveRecord::Base.establish_connection(config)
222+
end
223+
end
219224

220-
Flipper.configuration = nil
221-
Flipper.instance = nil
225+
after(:each) do
226+
ActiveRecord::Base.connection.close
227+
end
222228

223-
Flipper::Adapters.send(:remove_const, :ActiveRecord) if Flipper::Adapters.const_defined?(:ActiveRecord)
229+
it "does not raise an error" do
230+
Flipper.configuration = nil
231+
Flipper.instance = nil
224232

225-
silence do
226-
expect {
227-
load 'flipper/adapters/active_record.rb'
228-
Flipper::Adapters::ActiveRecord.new
229-
}.not_to raise_error
233+
silence do
234+
expect {
235+
load 'flipper/adapters/active_record.rb'
236+
Flipper::Adapters::ActiveRecord.new
237+
}.not_to raise_error
238+
end
230239
end
231240
end
232241
end

0 commit comments

Comments
 (0)