Forum: Ruby ActiveRecord curious behaviour

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Alexandru E. Ungur (Guest)
on 2007-01-25 19:53
(Received via mailing list)
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
David G. (Guest)
on 2007-01-26 01:17
(Received via mailing list)
Hi Alex

On 1/25/07, Alexandru E. Ungur <removed_email_address@domain.invalid> 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
Alexandru E. Ungur (Guest)
on 2007-01-26 10:56
(Received via mailing list)
>>> 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 :-)

Have a nice day everyone,
Alex
This topic is locked and can not be replied to.