From: David Goodlad Date: 2007-01-26T08:16:30+09:00 Subject: Re: [OT maybe] ActiveRecord curious behaviour Hi Alex On 1/25/07, Alexandru E. Ungur wrote: > 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 ;-) 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 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 -- Dave Goodlad dgoodlad@gmail.com or dave@goodlad.ca http://david.goodlad.ca/