# Array help needed

**URL:** <https://www.ruby-forum.com/t/array-help-needed/130226>\
**Category:** Ruby\
**Created:** [February 26, 2008, 3:27pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226 "2008-02-26T15:27:44Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 3:27pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/1 "2008-02-26T15:27:44Z")

</div>

Hello, sorry if this question is stupid but I can’t find a solution  
after several readings about Arrays

Array ‘a’ contains several objets (ruby classes instances), each  
instance have an id property

I need a clean solution to return true if array ‘a’ contains an instance  
with id foo without iterating the whole array.

Example

def add\_user(user)  
unless users.include?(user.id)  
users \<\< user  
end  
end

users.include? statement is wrong because we compare id’s with objects.  
Which is the right way to do it ?

Thanks

---

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 3:37pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/2 "2008-02-26T15:37:44Z")

</div>

On Tue, Feb 26, 2008 at 3:20 PM, Zouplaz [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Example
> 
> def add\_user(user)

- unless users.include?(user.id)

- unless users.any? {|u| user.id == u.id }

---

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 3:42pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/3 "2008-02-26T15:42:29Z")

</div>

On Tue, Feb 26, 2008 at 9:36 AM, Jano S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > with id foo without iterating the whole array.
> > 
> > Example
> > 
> > def add\_user(user)
> 
> - unless users.include?(user.id)
> 
> - unless users.any? {|u| user.id == u.id }
> 
> > ```
> > users << user
> > 
> > ```
> > 
> > end  
> > end

If you can’t do this

def add\_user(user)  
unless users.include?(user) # just check the user instead of the id  
users \<\< user  
end  
end

then I’d also recommend Jano’s solution.

Regards,  
Craig

---

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 3:47pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/4 "2008-02-26T15:47:52Z")

</div>

2008/2/26, Jano S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > Example
> > 
> > def add\_user(user)
> 
> - unless users.include?(user.id)
> 
> - unless users.any? {|u| user.id == u.id }
> 
> > ```
> > users << user
> > 
> > ```
> > 
> > end  
> > end

For a more efficient solution use a Hash:

def add\_user(user)  
@users[user.id] ||= user  
end

def users  
@users.values  
end

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 4:03pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/5 "2008-02-26T16:03:51Z")

</div>

On 2/26/08, Christopher S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 
> 
> end
> 
> Christopher

Additionally, if a unique user always has the same id (for instance,  
they’re defined in a database and the id is the primary key), then you  
can override #== in your class to compare ids to determine equality.  
Then you can just call #include? with the user directly:

def add\_user(user)  
unless users.include?(user)  
users \<\< user  
end  
end

This is almost definitely the most efficient solution, but it does  
require you to modify your class.

Best,  
Christopher

---

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 11:32pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/6 "2008-02-26T23:32:11Z")

</div>

le 26/02/2008 15:36, Jano S. nous a dit:

> > def add\_user(user)
> 
> - unless users.include?(user.id)
> 
> - unless users.any? {|u| user.id == u.id }
> 
> > ```
> > users << user
> > 
> > ```
> > 
> > end  
> > end

Fine ! This is was I was looking for.

Thanks to people who answered…

---

<div class="post-metadata">

**Author:** ![Zouplaz](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/a4c791/32.png) [@Zouplaz](https://www.ruby-forum.com/u/Zouplaz)\
**Post date:** [February 26, 2008, 3:49pm UTC](https://www.ruby-forum.com/t/array-help-needed/130226/7 "2008-02-26T15:49:39Z")

</div>

On 2/26/08, Zouplaz [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Example
> 
> def add\_user(user)  
> unless users.include?(user.id)  
> users \<\< user  
> end  
> end
> 
> users.include? statement is wrong because we compare id’s with objects.  
> Which is the right way to do it ?

Read up on the Enumerable module.  
[module Enumerable - RDoc Documentation](http://www.ruby-doc.org/core/classes/Enumerable.html#M003153).

You have a couple of options. The simplest code-wise is to use find:

def add\_user(user)  
unless users.find { |u| u.id == user.id }  
users \<\< user  
end  
end

Potentially marginally more efficient is #map and then calling  
#include? on the result

def add\_user(user)  
unless users.map { |u| u.id }.include?(user.id)  
users \<\< user  
end  
end

Christopher
