diff options
-rw-r--r-- | lib/arel/nodes/select_core.rb | 7 | ||||
-rw-r--r-- | spec/arel/nodes/select_core_spec.rb | 23 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/arel/nodes/select_core.rb b/lib/arel/nodes/select_core.rb index 39145de697..7ebdab315d 100644 --- a/lib/arel/nodes/select_core.rb +++ b/lib/arel/nodes/select_core.rb @@ -8,6 +8,13 @@ module Arel @projections = [] @wheres = [] end + + def initialize_copy other + super + @froms = @froms.map { |o| o.clone } + @projections = @projections.map { |o| o.clone } + @wheres = @wheres.map { |o| o.clone } + end end end end diff --git a/spec/arel/nodes/select_core_spec.rb b/spec/arel/nodes/select_core_spec.rb new file mode 100644 index 0000000000..cf717a3904 --- /dev/null +++ b/spec/arel/nodes/select_core_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Arel::Nodes::SelectCore do + describe "#clone" do + it "clones froms, projections and wheres" do + core = Arel::Nodes::SelectCore.new + core.instance_variable_set "@froms", %w[a b c] + core.instance_variable_set "@projections", %w[d e f] + core.instance_variable_set "@wheres", %w[g h i] + + [:froms, :projections, :wheres].each do |array_attr| + core.send(array_attr).each_with_index do |o, j| + o.should_receive(:clone).and_return("#{o}#{j}") + end + end + + dolly = core.clone + dolly.froms.should == %w[a0 b1 c2] + dolly.projections.should == %w[d0 e1 f2] + dolly.wheres.should == %w[g0 h1 i2] + end + end +end |