Hi,
Found a simple example breaking on moving to 2.2 from 2.0. This
example illustrates the usage of nested :include finder options.
class Book < ActiveRecord::Base
has_many :distributors
end
class Distributor < ActiveRecord::Base
belongs_to :book
has_many :agents
end
class Agent < ActiveRecord::Base
belongs_to :distributor
has_many :shops
end
class Shop < ActiveRecord::Base
belongs_to :agent
end
Schema - http://pastie.org/426261
def test_should_load_avatars
shop_1= Shop.create!
shop_2= Shop.create!
book= Book.create!(:distributors => [Distributor.create!(:agents=>
[Agent.create!(:shops => [shop_2, shop_2])])])
loaded_version = Book.find(book.id, :include => [:distributors =>
{:agents => :shops}], :order => ‘shops.id’)
assert(loaded_version.distributors.first.agents.first.shops.size ==
2) #THIS ASSERTION FAILS WITH SHOPS.SIZE BEING 1, INSTEAD OF 2
end
On some investigation, I found that the query fired was correct, but
Rails was unable to instantiate the ‘shops’ collection properly.
Any help on this issue would be appreciated.
Thanks
On Mar 25, 5:19 am, Akshay R. [email protected] wrote:
#THIS ASSERTION FAILS WITH SHOPS.SIZE BEING 1, INSTEAD OF 2
end
On some investigation, I found that the query fired was correct, but
Rails was unable to instantiate the ‘shops’ collection properly.
The problem is not to do with the nested-ness of the includes but
because you have an agent with the same shop twice (the line in
question that removes duplicates is
primary_id = join_base.record_id(row)
unless @base_records_hash[primary_id]
@base_records_in_order << (@base_records_hash[primary_id] = join_base.instantiate(row))
end
construct(@base_records_hash[primary_id], @associations, join_associations.dup, row)
end
remove_duplicate_results!(join_base.active_record, @base_records_in_order, @associations)
return @base_records_in_order
end
def remove_duplicate_results!(base, records, associations)
case associations
when Symbol, String
reflection = base.reflections[associations]
if reflection && [:has_many, :has_and_belongs_to_many].include?(reflection.macro)
records.each { |record| record.send(reflection.name).target.uniq! }
end
when Array
associations.each do |association|
remove_duplicate_results!(base, records, association)
end
Fred
Bad paste. The problem again. Looks like it is a problem only when there
is
a has_one relationship.
class Book < ActiveRecord::Base
has_one :distributor
end
class Distributor < ActiveRecord::Base
belongs_to :book
has_many :agents
end
class Agent < ActiveRecord::Base
belongs_to :distributor
has_many :shops
end
class Shop < ActiveRecord::Base
belongs_to :agent
end
Schema - http://pastie.org/426261
def test_should_load_avatars
shop_1= Shop.create!
shop_2= Shop.create!
book= Book.create!(:distributor => Distributor.create!(:agents=>
[Agent.create!(:shops => [shop_1, shop_2])]))
loaded_version = Book.find(book.id, :include => [:distributor =>
{:agents
=> :shops}], :order => ‘shops.id’)
assert(loaded_version.distributor.agents.first.shops.size == 2)
#THIS ASSERTION FAILS WITH SHOPS.SIZE BEING 1, INSTEAD OF 2
end
This fails on Rails 2.2.2.
Any help on this would be much appreciated,
Akshay
On Mar 25, 2009 4:04am, Frederick C. [email protected]
wrote:
On Mar 25, 5:19 am, Akshay R. [email protected] > wrote:
def test_should_load_avatars
shop_1= Shop.create!
shop_2= Shop.create!
book= Book.create!(:distributors => [Distributor.create!(:agents=>
[Agent.create!(:shops => [shop_2, shop_2])])])
loaded_version = Book.find(book.id, :include => [:distributors =>
{:agents => :shops}], :order => ‘shops.id’)
assert(loaded_version.distributors.first.agents.first.shops.size ==
#THIS ASSERTION FAILS WITH SHOPS.SIZE BEING 1, INSTEAD OF 2
end
On some investigation, I found that the query fired was correct, but
Rails was unable to instantiate the ‘shops’ collection properly.
The problem is not to do with the nested-ness of the includes but
because you have an agent with the same shop twice (the line in
question that removes duplicates is
rails/activerecord/lib/active_record/associations.rb at f97832b1e4406a76d268a96b521d2297adec0ae3 · rails/rails · GitHub
Fred
Any help on this issue would be appreciated.
Thanks
On Mar 25, 1:45 pm, [email protected] wrote:
Bad paste. The problem again. Looks like it is a problem only when there is
a has_one relationship.
Do you need all these models/associations or is there a small test
case that fails ?
Fred
On Mar 25, 6:39 pm, akshay rawat [email protected] wrote:
Thanks for looking at it.A one file test -http://pastie.org/426840
Another thing I saw was that the that test passes when :include is replaced
with :joins.
Not surprising - in that case the association isn’t eager loaded at
all. If it passes without the order clause then you’ve narrowed it
down to the joins based include mechanism.
Fred
Yup, it passes without the :order option, indicating that there is a
problem
with the join based mechanism. Thanks
On Wed, Mar 25, 2009 at 2:49 PM, Frederick C. <
So is this a valid Rails bug ? Should I create a ticket for it on
Lighthouse
?
On Mar 25, 10:01 pm, akshay rawat [email protected] wrote:
So is this a valid Rails bug ? Should I create a ticket for it on Lighthouse
?
Seems like you already have :-). I’d definitely check against 2.3.2 -
I remember there being a fix for a :include bug somewhere.
Fred
Just checked, this test fails on Rails 2.3.2 too.
Thanks for looking into it.
On Wed, Mar 25, 2009 at 6:24 PM, Frederick C. <
Thanks for looking at it.A one file test - http://pastie.org/426840
Another thing I saw was that the that test passes when :include is
replaced
with :joins.
On Wed, Mar 25, 2009 at 2:05 PM, Frederick C. <