Information about query caching and HM through

Hi there,

I would like to find more information about query caching, or about the concept behind the following behavior, in a "User has many Groups through Memberships" association. Let me show you an example.

# Base :

user = User.find_by_email('john.doe@example.org') group = List.create( :title => "First group" ) group2 = List.create( :title => "Second group" )

# if I do this :

Membership.create(:group => group, :user => user) Membership.create(:group => group2, :user => user)

user.groups.each do |g| puts g.title end

# the result is as expected First group Second group

# But if do this :

Membership.create(:group => group, :user => user) user.groups.each do |g| puts g.title end Membership.create(:group => group2, :user => user) user.groups.each do |g| puts g.title end

# the result is : First group First group

# instead of First group First group Second group

What's the magic behind that ? Also, what's the best way to create new memberships and avoid troubles ?

Thanks

Hi there,

I would like to find more information about query caching, or about
the concept behind the following behavior, in a "User has many Groups through Memberships" association. Let me show you an example.

# Base :

user = User.find_by_email('john.doe@example.org') group = List.create( :title => "First group" ) group2 = List.create( :title => "Second group" )

# if I do this :

Membership.create(:group => group, :user => user) Membership.create(:group => group2, :user => user)

user.groups.each do |g| puts g.title end

# the result is as expected First group Second group

# But if do this :

Membership.create(:group => group, :user => user) user.groups.each do |g| puts g.title end Membership.create(:group => group2, :user => user) user.groups.each do |g| puts g.title end

This isn't a query caching problem, it's activerecord's association
caching (so if you were to add a user.reload or a user.groups.reload
in there you would get the right answer)

Fred

OK, I indeed found that a .reload could do the trick.

But I suppose we are not condemned to do a .reload before every call to an association, so how do you avoid that ?