Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

.each called twice #6

Closed
jacquescrocker opened this issue Apr 12, 2011 · 13 comments
Closed

.each called twice #6

jacquescrocker opened this issue Apr 12, 2011 · 13 comments
Labels

Comments

@jacquescrocker
Copy link

sort of a low priority bug, however I noticed that object @users will iterate over @users twice.

This is noticeable in ORMs that return criteria objects that execute the query on iteration (such as mongoid). So the query actually gets executed twice.

Probably something to watch for and maybe add a unit test for it at some point. Not a huge deal since I can do to_a on the object before rendering it to rabl.

@nesquena
Copy link
Owner

Thanks for the heads up, I will definitely check out how to fix this soon.

@nesquena
Copy link
Owner

I think this has been fixed, can you confirm if this still happens?

@nesquena
Copy link
Owner

Closing, re-open if you notice this in last version.

@jacquescrocker
Copy link
Author

just switched my project's bundle to the git version. the kicker now gets executed 3 times :-)

@nesquena
Copy link
Owner

That is awesomely bad. Can you help me with a simple test sample? I have two AR models: Users and Address and User has_one address. I created a bunch of users in AR and then did:

get "/" do
  @users = User.includes(:address).where('name != ?', 'frank')
  render "users"
end

with users template:

object @users

attribute :id, :name, :age

child :address do
  attribute :street, :city
end

code :foo do |m|
  m.name + "!"
end

and the logs show this:

DEBUG - [14/Apr/2011 12:53:18] "User Load (0.8ms)  SELECT "users".* FROM "users" WHERE (name != 'frank')"
DEBUG - [14/Apr/2011 12:53:18] "Address Load (0.4ms)  SELECT "addresses".* FROM "addresses" WHERE ("addresses".user_id IN (1,2,3))"

I think I am doing the test wrong. Do you think this is criteria objects in mongoid specific? I do check respond_to? on the object once or twice, I wonder if even a respond_to? kicks the object.

@jacquescrocker
Copy link
Author

no prob, here's a simple sample project that replicates the bug: http://cl.ly/231i0N0k2M1X0J0j3918

@nesquena
Copy link
Owner

Also, I pushed to git version a new little hack that should fix it when you use the collection declaration instead of object.

collection @users

instead of object will force the passed in object to a collection with to_a. I would prefer a more elegant solution though such that using the 'object' directly still works.

@nesquena
Copy link
Owner

Thanks will try to come up with a better solution based on that test project. Can you confirm if on latest git rev that using collection solves it at least?

@jacquescrocker
Copy link
Author

cool, sounds good. i have a breakpoint in the rabl src code, tracing through it now. i'll let you know if i come up with anything

@nesquena
Copy link
Owner

Awesome thanks, would love to know the root cause of the three invocations.

@jacquescrocker
Copy link
Author

hmm, it might just be a mongoid issue

e @_data.respond_to?(:each_pair)
MONGODB rabl['users'].find({})

@jacquescrocker
Copy link
Author

ok, looks like this is just a mongoid issue. it's executing a query whenever respond_to? is called on the criteria object. the solution you added of doing a .to_a on the collection @users is great and should solve my issues in the meantime. thanks!

@nesquena
Copy link
Owner

Yeah kicking on respond_to? is kind of sloppy, tempted to report the issue for mongoid. AR and DM act as you'd expect (no kick). Cleaned up the implementation of collection, I don't think it's that bad of an approach to fixing this for now. I kind of think it is a bit cleaner to declare the collection explicitly anyways. Thanks for your help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants