ActiveRecord curious behaviour

Hi all,

I appologise if this question is offtopic, hopefully it isn’t though…

I have:
Forum has_many :comments

so obviously, I access the comments collection as
some_forum.comments

check its type with:
some_forum.comments.class # => Array

ok, that I expected, so I want to use Array#find on it, right?
some_forum.comments.find {…}

but oops, I get:
ActiveRecord::RecordNotFound: Couldn’t find Comment without an ID

Hmm, that find is not the find I expected to find :wink: Looks like
an AR#find to me… but on an Array? It’s not like I need SQL to
find certain elements of an Array… so I find this behaviour very
interesting. Am I doing something wrong here ? I can find the
element(s) I want from it, by iterating over it and selecting them,
but not by using find.

BTW, it’s Rails 1.1.6/AR 1.14.4 I’m having this behaviour on, haven’t
tested it on other versions.

Thank you in advance,
Alex

Hi Alex

On 1/25/07, Alexandru E. Ungur [email protected] wrote:

check its type with:
find certain elements of an Array… so I find this behaviour very
interesting. Am I doing something wrong here ? I can find the
element(s) I want from it, by iterating over it and selecting them,
but not by using find.

BTW, it’s Rails 1.1.6/AR 1.14.4 I’m having this behaviour on, haven’t
tested it on other versions.

Thank you in advance,
Alex

It would probably be ore appropriate to ask this on the rails-users
mailing list, rather than this one.

However, here’s why you’re seeing this behavior. An AR association,
when accessed, returns a proxy object that looks like an Array, but
has some extra methods: ‘find’, ‘build’, etc. For example:

comments = some_forum.comments
comments.class # => Array
comments.build :foo => ‘bar’ # :build is obviously not a method on Array

If you want to use Array#find or Array#find_all on an AssociationProxy
object, you can call #detect and #select instead.

Dave

sender: “David G.” date: “Fri, Jan 26, 2007 at 08:16:30AM +0900” <<<EOQ
Hi,

It would probably be ore appropriate to ask this on the rails-users
mailing list, rather than this one.
Ok then, sorry for the noise, and a warm thank you for the
explanation :slight_smile:

Have a nice day everyone,
Alex