Forum: Ruby on Rails do not understand collect method use wit property

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.
Hiro P. (Guest)
on 2009-03-11 19:35
Hi all,
Can someone explain to me in terms of ruby why this works?

Story.find_all_by_user_id(2).collect(&:link)    # 1  method call

This is in ROR console.  link is a property of Story.  The above command
finds all db rows and all their properties (columns) with user_id == 2
and creates an array with only the link property.

This is same as:
Story.find_all_by_user_id(2).collect{|x| x.link}  # 2  block

I understand function #2 with use of a block.

I do not understand function #1 in terms of syntax.  What  is &:link?  I
know it represents a property and could accept that this is the way it
works but I want to understand this in terms of ruby syntax.  Is &:link
a block?  If so it would have to represent x.link.  I do not understand
how this is generated in ruby.

TIA,
Pete
Harold (Guest)
on 2009-03-11 20:03
(Received via mailing list)
They are both equivalent in terms of functionality.

The first is a common rails idiom:

@some_collection.collect(&:id)
or
@some_collection.map(&:id) #I've seen this one used more than
collect...

The ampersand syntax is simply telling the interpreter that the symbol
is the block parameter to the method. Internally the to_proc method of
the symbol class is called.

Here's a reference:
http://apidock.com/rails/Symbol/to_proc

Beware, doing @foo.map(&:id) doesn't perform as well as @foo.map { |f|
f.id } for big numbers of foos...
Also note that this is a Rails only feature (ie: try it on plain irb
and it will not work).

On Mar 11, 1:35 pm, Hiro P. <rails-mailing-l...@andreas-
Hiro P. (Guest)
on 2009-03-11 20:21
Cool.  Thanks for explanation.

Pete

Harold wrote:
> They are both equivalent in terms of functionality.
>
> The first is a common rails idiom:
>
> @some_collection.collect(&:id)
> or
> @some_collection.map(&:id) #I've seen this one used more than
> collect...
>
> The ampersand syntax is simply telling the interpreter that the symbol
> is the block parameter to the method. Internally the to_proc method of
> the symbol class is called.
>
> Here's a reference:
> http://apidock.com/rails/Symbol/to_proc
>
> Beware, doing @foo.map(&:id) doesn't perform as well as @foo.map { |f|
> f.id } for big numbers of foos...
> Also note that this is a Rails only feature (ie: try it on plain irb
> and it will not work).
>
> On Mar 11, 1:35�pm, Hiro P. <rails-mailing-l...@andreas-
This topic is locked and can not be replied to.