# Active Record Associations

**URL:** <https://www.ruby-forum.com/t/active-record-associations/159967>\
**Category:** Rails\
**Created:** [February 10, 2009, 3:31pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967 "2009-02-10T15:31:11Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 10, 2009, 3:31pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/1 "2009-02-10T15:31:11Z")

</div>

I have tables:

users (id, name)  
computers (id, name)  
mobiltelefons (id, name)

OwnComputers (id, user\_id, computer\_id)  
OwnMobiltelefons (id, user\_id, mobiltelefon\_id)

So is it has\_many :through or has\_and\_belongs\_to\_many or what?

I only need to search one “own” table at time:  
All computers that user “xx” owns OR  
All Mobiltelefons that user “xx” owns OR  
who owns mobilitefon “zz” OR  
who owns computer “yy”

So…

class Computers \< ActiveRecord::Base  
has\_many :OwnComputer  
has\_many :user, :through =\> :OwnComputer  
end

class OwnComputers \< ActiveRecord::Base  
belongs\_to :Computer  
belongs\_to :User  
end

class Users \< ActiveRecord::Base  
???  
end

class Mobiltelefons \< ActiveRecord::Base  
???  
end

class OwnMobiltelefons \< ActiveRecord::Base  
???  
end

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 10, 2009, 5:54pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/2 "2009-02-10T17:54:33Z")

</div>

If I understand correctly what you need, a computer may belong to many  
users and one user can have many computer, right? same for phones, I  
assume.

In this case, the relationship is :has\_and\_belongs\_to\_many, but you do  
not need the classes OwnComputer and the other one. you just need two  
tables (without id) which will contain, for each record, a couple of  
id identifying one coupling (user-computer for one table, user-phone  
for the other).  
have a look at:  
[http://wiki.rubyonrails.org/rails/pages/has\_and\_belongs\_to\_many](http://wiki.rubyonrails.org/rails/pages/has_and_belongs_to_many)  
for naming conventions.

Regards,

Rey9999

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 10, 2009, 6:42pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/3 "2009-02-10T18:42:21Z")

</div>

Rey9999 wrote:

> If I understand correctly what you need, a computer may belong to many  
> users and one user can have many computer, right? same for phones, I  
> assume.

Yes

> In this case, the relationship is :has\_and\_belongs\_to\_many, but you do

How can I find all users whose name is “James%” and their computers (not  
mobiles)?

User.find(:all, ???)

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 11, 2009, 9:32am UTC](https://www.ruby-forum.com/t/active-record-associations/159967/4 "2009-02-11T09:32:53Z")

</div>

> How can I find all users whose name is “James%” and their computers (not  
> mobiles)?
> 
> User.find(:all, ???)

Help ???

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 11, 2009, 2:45pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/5 "2009-02-11T14:45:24Z")

</div>

Sijo Kg wrote:

I mean something like this:

SELECT users.name, computers.name FROM users, OwnComputers, computers  
JOIN OwnComputers ON users.id = OwnComputers.users\_id  
JOIN computers ON OwnComputers.computers\_id = computers.id  
WHERE user.name LIKE “James%”

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 11, 2009, 1:50pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/6 "2009-02-11T13:50:00Z")

</div>

Hi

@users = User.find(:all,:conditions=\> [‘name LIKE ?’, “James%”])  
@user\_computers = []  
@users.each do |user|  
@user\_computers \<\< user.computers  
end

@user\_computers now contains computers you need

Sijo

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 11, 2009, 2:59pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/7 "2009-02-11T14:59:11Z")

</div>

Or use has\_many :through instead.

Blog: [http://random8.zenunit.com/](http://random8.zenunit.com/)  
Learn rails: [http://sensei.zenunit.com/](http://sensei.zenunit.com/)

On 11/02/2009, at 11:50 PM, Sijo Kg [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 11, 2009, 4:26pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/8 "2009-02-11T16:26:20Z")

</div>

Why is a good question here. In other words, what are you going to do  
with the computers and users once  
You get them.

Blog: [http://random8.zenunit.com/](http://random8.zenunit.com/)  
Learn rails: [http://sensei.zenunit.com/](http://sensei.zenunit.com/)

On 11/02/2009, at 4:42 AM, James B. \<rails-mailing-list@andreas-

---

<div class="post-metadata">

**Author:** ![giga](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/b9bd4f/32.png) [@giga](https://www.ruby-forum.com/u/giga)\
**Post date:** [February 11, 2009, 3:00pm UTC](https://www.ruby-forum.com/t/active-record-associations/159967/9 "2009-02-11T15:00:59Z")

</div>

Oh by the way if you do that you’ll end up with an array of arrays.  
Might not be what you want.

Blog: [http://random8.zenunit.com/](http://random8.zenunit.com/)  
Learn rails: [http://sensei.zenunit.com/](http://sensei.zenunit.com/)

On 11/02/2009, at 11:50 PM, Sijo Kg [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
