mongoid/mongoid — Issue #1466: Relationship with alias_method_chain returns extra object
Author: jhchen
Created: 2011-12-01 13:30:58+00:00
State: open

I have a tree structure model and but looping over the children of an object, if an alias method chain is used, will return one too many objects. Doing .length will return the correct length but actually looping over the enumerable will reveal one extra object.

Here's the model file and test script to demonstrate this behavior.

```ruby
parent = Foo.new
child = Foo.new
link = Foo.new

child.parent = parent
link.link_to = parent
link.is_link = true

parent.save
child.save
link.save

puts link.children.length # Expected to print 1 which it does

link.children.each do |obj| # Expects only 1 child, but prints 2
puts obj.id
end
```

```ruby
class Foo
include Mongoid::Document

has_many :children, :foreign_key => "parent_id", :class_name => "Foo"
belongs_to :parent, :foreign_key => "parent_id", :class_name => "Foo"
belongs_to :link_to, :foreign_key => "link_id", :class_name => "Foo"
has_many :linked_by, :foreign_key => "link_id", :class_name => "Foo"

field :is_link, :type => Boolean, :default => false

def children_with_bar
self.is_link ? self.link_to.children : self.children_without_bar
end

alias_method_chain :children, :bar
end
```

I get the following output with rails 3.1.3 and mongoid 2.3.4:
1
4ed77ef435d3e9c4f5000002
4ed77ef435d3e9c4f5000003

The 1 is expected for the length but as you can see 2 id's are printed even though the length is supposedly 1.