Skip to content

Commit fa27fa2

Browse files
author
Marcel M. Cary
committed
Fix error with annonymous ActiveRecord classes
I'm seeing this error while running any spec for ActiveRecord Source or Sink classes: Anonymous class is not allowed The problem is that support for "Class.new(ActiveRecord::Base)" (aka anonymous subclasses) was dropped in recent versions of Rails. (rails/rails#8934) Find another way to generate AR classes.
1 parent 8882b8a commit fa27fa2

File tree

4 files changed

+37
-8
lines changed

4 files changed

+37
-8
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Wolverine
2+
class ActiveRecordClassGenerator
3+
def initialize(mod, table_name)
4+
@mod = mod
5+
@table_name = table_name
6+
end
7+
def generate
8+
# This is no longer permitted by AR: Class.new(ActiveRecord::Base)
9+
klass_name = [
10+
"Record",
11+
table_name.gsub(/[^a-z0-9]+/i, '_'),
12+
Time.now.to_i,
13+
rand(100_000_000..1_000_000_000),
14+
].join("_")
15+
eval "class #{mod.name}::#{klass_name} < ActiveRecord::Base; end"
16+
klass = mod.const_get(klass_name, inherit=false)
17+
klass.table_name = table_name
18+
klass
19+
end
20+
private
21+
attr_reader :mod, :table_name
22+
end
23+
end

lib/wolverine/active_record_sink.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'wolverine/active_record_class_generator'
2+
13
module Wolverine
24
class ActiveRecordSink < Sink
35
attr_reader :columns, :klass
@@ -8,8 +10,8 @@ def initialize(source, klass)
810
end
911
def self.create(source, table_name, columns, connection_params)
1012
require 'active_record'
11-
klass = Class.new(ActiveRecord::Base)
12-
klass.class_eval { self.table_name = table_name }
13+
gen = ActiveRecordClassGenerator.new(self, table_name)
14+
klass = gen.generate
1315
klass.establish_connection(connection_params)
1416
klass.connection.create_table table_name do |t|
1517
t.column :text, :text

lib/wolverine/active_record_source.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'wolverine/active_record_class_generator'
2+
13
module Wolverine
24
class ActiveRecordSource < Source
35
attr_reader :klass
@@ -10,9 +12,9 @@ def initialize(active_record_klass, conditions={}, search=nil)
1012
end
1113
def self.open(table_name, connection_params)
1214
require 'active_record'
13-
klass = Class.new(ActiveRecord::Base)
15+
gen = ActiveRecordClassGenerator.new(self, table_name)
16+
klass = gen.generate
1417
klass.class_eval do
15-
self.table_name = table_name
1618
def to_s
1719
text
1820
end

spec/wolverine/active_record_sink_spec.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
Tempfile.open("wol-spec") do |file|
66
source = Wolverine::ArraySource.new(["x y"])
77
filt = Wolverine::FieldFilter.new(source, /(x)/, :x)
8+
config = { :adapter => "sqlite3", :database => file.path }
89
sink = Wolverine::ActiveRecordSink.create(filt, "events", [:x],
9-
:adapter => "sqlite3",
10-
:database => file.path)
10+
config)
1111

1212
sink.run
1313

14-
klass = Class.new(ActiveRecord::Base)
15-
klass.class_eval { self.table_name = "events" }
14+
gen = Wolverine::ActiveRecordClassGenerator.
15+
new(self.class, "events")
16+
klass = gen.generate
17+
klass.establish_connection(config)
1618
events = klass.all
1719
events.length.should == 1
1820
events.first.x.should == "x"

0 commit comments

Comments
 (0)