# How can I create array of strings or a hash from ActiveRecord result set?

**URL:** <https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548>\
**Category:** Rails\
**Created:** [September 26, 2007, 5:42am UTC](https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548 "2007-09-26T05:42:07Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![eafonsof](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/9e8a1a/32.png) [@eafonsof](https://www.ruby-forum.com/u/eafonsof)\
**Post date:** [September 26, 2007, 5:42am UTC](https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548/1 "2007-09-26T05:42:07Z")

</div>

Is there a way to do that in a single shot? Or what’s the most  
efficient way of doing that?  
I’ve researched a lot but did not find out how to do it yet.  
Any help will be much appreciated.

Example (the syntax is not correct is some cases):

- Models:  
User belongs\_to :group  
Group has\_many :users

- Controller:  
#User columns: id, email, group\_id, etc.  
@users = User.find(:all, :order =\> “group\_id”)

- View:  
\<%= mail\_to ‘removed\_email\_address@domain.invalid’, ‘Email Everybody 1’, :subject =\>  
‘Subject’, :bcc =\> @emails1.join(’,’) %\>  
\<%= mail\_to ‘removed\_email\_address@domain.invalid’, ‘Email Everybody 2’, :subject =\>  
‘Subject’, :bcc =\> @emails2 %\>  
\<%= mail\_to ‘removed\_email\_address@domain.invalid’, ‘Email Group ’ + @group\_id, :subject =\>  
‘Subject’, :bcc =\> @emails[@group\_id].join(’,’) %\>  
etc

---

<div class="post-metadata">

**Author:** ![eafonsof](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/9e8a1a/32.png) [@eafonsof](https://www.ruby-forum.com/u/eafonsof)\
**Post date:** [September 26, 2007, 6:50am UTC](https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548/2 "2007-09-26T06:50:29Z")

</div>

@users = User.find(:all, :order =\> “group\_id”)  
@emails1 = @users.collect{|u| u.email}  
@emails2 = @emails1.join ‘,’  
@emails3 = {}  
@users.each{|u| @emails3[u.group\_id] ||= []; @emails3[u.group\_id] \<\<  
u.email}

There may be a more creative way to do the last one, but this should get  
you started.

---

<div class="post-metadata">

**Author:** ![eafonsof](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/9e8a1a/32.png) [@eafonsof](https://www.ruby-forum.com/u/eafonsof)\
**Post date:** [September 26, 2007, 2:59pm UTC](https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548/3 "2007-09-26T14:59:33Z")

</div>

This is amazing. Works perfect.  
Thanks!!!

---

<div class="post-metadata">

**Author:** ![eafonsof](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/9e8a1a/32.png) [@eafonsof](https://www.ruby-forum.com/u/eafonsof)\
**Post date:** [September 26, 2007, 3:10pm UTC](https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548/4 "2007-09-26T15:10:07Z")

</div>

On 9/26/07, eafonsof [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> This is amazing. Works perfect.  
> Thanks!!!

The email array and string part are pretty much as William has shown.  
For  
the grouped email hash you can use the group\_by method which is part of  
enumerable. It’s a bit slower than manually doing it. But depending on  
your tastes it might suit you better.

@emails3 = @users.group\_by(&:group\_id).each{ |email\_array|  
email\_array.map!(&:email) }

HTH  
Daniel

---

<div class="post-metadata">

**Author:** ![eafonsof](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/9e8a1a/32.png) [@eafonsof](https://www.ruby-forum.com/u/eafonsof)\
**Post date:** [September 26, 2007, 3:27pm UTC](https://www.ruby-forum.com/t/how-can-i-create-array-of-strings-or-a-hash-from-activerecord-result-set/115548/5 "2007-09-26T15:27:44Z")

</div>

On Sep 26, 2007, at 12:49 AM, William P. wrote:

> > Group has\_many :users  
> > [group\_id\_1 =\> [email\_1,email\_2], group\_id\_2 =\>
> 
> @users = User.find(:all, :order =\> “group\_id”)  
> @emails1 = @users.collect{|u| u.email}  
> @emails2 = @emails1.join ‘,’  
> @emails3 = {}  
> @users.each{|u| @emails3[u.group\_id] ||= []; @emails3[u.group\_id] \<\<  
> u.email}
> 
> There may be a more creative way to do the last one, but this  
> should get  
> you started.

@users = User.find(:all, :order =\> “group\_id”)  
@emails1 = @users.map(&:email)

@emails2 = @emails1.join ‘,’

@emails3 = @users.inject(Hash.new {|h,k| h[k] = []}) {|h,u| h  
[u.group\_id] \<\< u.email; h}

Well, that last one might be a bit too creative for some 😉

-Rob

Rob B. [http://agileconsultingllc.com](http://agileconsultingllc.com)  
removed\_email\_address@domain.invalid
