undefined method `count' for Array...

I am experiencing something quite weird... it must come from my environment, but I am not sure how to track it down.

I have this bit of code:

User.all.count

In my dev environment I get this;

script/console Loading development environment (Rails 2.1.0) ** Loading custom logger format for rawk

User.all.count

=> 2

in production:

script/console production Loading production environment (Rails 2.1.0) ** Loading custom logger format for rawk

User.all.count

NoMethodError: undefined method `count' for #<Array:0xb5ca8874>   from (irb):1

Both are running in the same project, with the same frozen Rails, gems and plugins... but there must be something in my dev environment that is giving me this... any ideas? Is there any way to find out where an object is getting a method from?

Try User.count or User.all.size.

Thanks Ryan,

I know that those will work, I am just curious (i.e. concerned) about the differences in environments. I am not looking for how to get a total of Users... I want to know where that count method comes from!

The count method should've never existed on Array afaik. For example if you do:

[1,2,3,4].count you should get an undefined method error.

Same if you do it in irb. I have no idea where you're getting that count method from! Tried looking through your source for it?

use rdebug to step into the count method. Activerecord adds a count method to association proxies (which look like Arrays but aren't) and so on as well (but not actual arrays)

Fred

Um... good idea, if I knew anything about ruby debug... how do I step into count? Sorry for the newb questions.

Um... good idea, if I knew anything about ruby debug... how do I step into count? Sorry for the newb questions.

ifd Assuming you've got the ruby-debug gem installed then in script/console:

require 'ruby-debug' def test_method    debugger    User.all.count end test_method

at which point you should drop into the debugger. e to evaluate a ruby
expression, s to step, l to show you the code you're stepping through,
help to see more commands. (typing l to begin with might not work - seems like rdebug doesn't
like showing the source if the source was just part of an irb context
and not an actual file.

Fred

The count method comes from active record, it fits it's at the same level as the .find and .find_by etc methods. When you call .find(:all) you're getting back an array, not an active record association, so you can't call count on this. Ryan is correct that User.count(:all) or User.all.size should be used (.all returns the array)

thanks Jeremy... still doesn't explain why the code actually works fine in my dev environment. I think it has something to do with named_scopes. User.all is a named_scope I believe.

Production: script/console production Loading production environment (Rails 2.1.0)

User.all.class

=> Array

User.find(:all).class

=> Array

User.find(:all).count

NoMethodError: undefined method `count' for #<Array:0xb5c7819c>   from (irb):3

Development: script/console Loading development environment (Rails 2.1.0)

User.all.class

=> Array

User.find(:all).class

=> Array

User.find(:all).count

=> 2

James Brennan wrote:

You're probably seeing this error because ruby 1.8.7 introduced count as a method on Array, whereas it does not exist in 1.8.6. Chances are production is running 1.8.6 or earlier.

Thank you for your post. That's exactly what happened to me: dev: 1.8.7 prod: 1.8.6

Ryan Bigg wrote:

Try User.count or User.all.size.

Unless I missed it it seems that no one actually mentioned the real difference between these two calls. While they will produce the same end result the process of getting to that result is very different:

n = User.all.size => 123 SELECT * FROM "users"

n = User.count => 123 SELECT count(*) AS count_all FROM "users"

Obviously the latter is significantly more efficient.