# Adding methods to Collections

**URL:** <https://www.ruby-forum.com/t/adding-methods-to-collections/128713>\
**Category:** Rails\
**Created:** [February 10, 2008, 9:22pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713 "2008-02-10T21:22:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![jonas\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jonas\_s](https://www.ruby-forum.com/u/jonas_s)\
**Post date:** [February 10, 2008, 9:22pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713/1 "2008-02-10T21:22:24Z")

</div>

Hello,

I´m planning to create a room managaement system in Rails.  
I have a collection of rooms, like this:

@rooms = Room.find :all

Then I want to write:

@rooms.to\_svg # (or any other method name)

to convert this collection of rooms into SVG.  
Now the question: Where do I have to define those methods?  
I could write

def @rooms.to\_svg

but that would be only for this collection; if I do Room.find :blah, I  
want to be able to do the same thing.

Thanks,  
Jonas

---

<div class="post-metadata">

**Author:** ![jonas\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jonas\_s](https://www.ruby-forum.com/u/jonas_s)\
**Post date:** [February 10, 2008, 9:30pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713/2 "2008-02-10T21:30:02Z")

</div>

On Sun, Feb 10, 2008 at 12:21:35PM -0800, Jonas S. wrote:

> to convert this collection of rooms into SVG.  
> Now the question: Where do I have to define those methods?  
> I could write
> 
> def @rooms.to\_svg
> 
> but that would be only for this collection; if I do Room.find :blah, I  
> want to be able to do the same thing.

class Room \< ActiveRecord::Base  
module MyCollectionMethods  
def to\_svg  
#…  
end  
end

def self.find(\*args)  
result = super(\*args)  
if args[0] == :all || Array === args[0]  
result.extend(MyCollectionMethods)  
end  
result  
end

end

Note: off the cuff and untested

> Thanks,  
> Jonas  
> –Greg

---

<div class="post-metadata">

**Author:** ![jonas\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jonas\_s](https://www.ruby-forum.com/u/jonas_s)\
**Post date:** [February 10, 2008, 10:04pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713/3 "2008-02-10T22:04:14Z")

</div>

On 10 Feb., 21:29, Gregory S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> ```
> result.extend(MyCollectionMethods)
> end
> result
> 
> ```
> 
> end
> 
> end

Yeah, works great =)

But why the check  
if args[0] == :all || Array === args[0]  
?

Greets  
Jonas

---

<div class="post-metadata">

**Author:** ![jonas\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jonas\_s](https://www.ruby-forum.com/u/jonas_s)\
**Post date:** [February 10, 2008, 10:09pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713/4 "2008-02-10T22:09:34Z")

</div>

On 10 Feb 2008, at 21:03, Jonas S. wrote:

> > def self.find(\*args)
> 
> But why the check  
> if args[0] == :all || Array === args[0]  
> ?

So that you don’t add the collection methods when find is not  
returning an Array (ie if you’re doing find(some\_id) or find :first)

Fred

---

<div class="post-metadata">

**Author:** ![jonas\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jonas\_s](https://www.ruby-forum.com/u/jonas_s)\
**Post date:** [February 10, 2008, 10:20pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713/5 "2008-02-10T22:20:15Z")

</div>

On 10 Feb., 22:09, Frederick C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> So that you don’t add the collection methods when find is not  
> returning an Array (ie if you’re doing find(some\_id) or find :first)

Ah, OK.  
Thanks!

–Jonas

---

<div class="post-metadata">

**Author:** ![jonas\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/dfb087/32.png) [@jonas\_s](https://www.ruby-forum.com/u/jonas_s)\
**Post date:** [February 10, 2008, 11:27pm UTC](https://www.ruby-forum.com/t/adding-methods-to-collections/128713/6 "2008-02-10T23:27:52Z")

</div>

We could do:

Unless result.is-array  
Result.extend  
End  
Result

Any thoughts?

[Http://www.rubyplus.org](Http://www.rubyplus.org)  
Free Ruby & Rails screencasts

On Feb 10, 2008, at 1:09 PM, Frederick C.  
\<removed\_email\_address@domain.invalid
