# About AR relationship

**URL:** <https://www.ruby-forum.com/t/about-ar-relationship/164104>\
**Category:** Rails\
**Created:** [March 27, 2009, 10:33pm UTC](https://www.ruby-forum.com/t/about-ar-relationship/164104 "2009-03-27T22:33:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [March 27, 2009, 10:33pm UTC](https://www.ruby-forum.com/t/about-ar-relationship/164104/1 "2009-03-27T22:33:30Z")

</div>

Hi,

I would like to make a relation using a different way then the classic  
belongs\_to/has\_many association. Instead of this, I would like to save  
the foreign key in the parent class as a list of ids.

For instance, we can consider 2 models: File and Folder.  
Basically, we could add in File model this method: folder\_id.

But can we do the same with a list of file’s ids stored in this folder’s  
method: file\_ids?

Thanks

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [March 27, 2009, 10:42pm UTC](https://www.ruby-forum.com/t/about-ar-relationship/164104/2 "2009-03-27T22:42:40Z")

</div>

On Fri, Mar 27, 2009 at 4:33 PM, Paul A.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> But can we do the same with a list of file’s ids stored in this folder’s  
> method: file\_ids?

Once you do your has\_many :files and belongs\_to :folder relationships,  
you get folder.file\_ids for free.

–  
Greg D.  
[http://destiney.com/](http://destiney.com/)

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [March 28, 2009, 6:47pm UTC](https://www.ruby-forum.com/t/about-ar-relationship/164104/3 "2009-03-28T18:47:00Z")

</div>

You could possibly do this, but why would you want to?

You’ll probably want to look into the ActiveRecord docs related to  
virtual attributes, and possibly serialized fields.

But again, WHY? The foreign key → parent relation is practically as  
old as databases, and going against that current is only going to land  
you on TheDailyWTF…

–Matt J.

On Mar 27, 5:33 pm, “Paul A.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [April 1, 2009, 5:53pm UTC](https://www.ruby-forum.com/t/about-ar-relationship/164104/4 "2009-04-01T17:53:42Z")

</div>

damianham wrote:  
[…]

> If the ‘folder.files’ element was an array of ids then there would be  
> no subsequent database access to determine the size() value.

Not really true; it takes a query in either case. Your method still  
needs “SELECT file\_ids FROM folders WHERE id = ?”. That’s not really  
going to perform any better than “SELECT count(\*) FROM files WHERE  
folder\_id = ?”, especially not if files.folder\_id is indexed.

If you’re really worried about performance, just cache Folder.file\_ids  
so you don’t have to query it every time.

Or you could use a nested-set tree model (there are several Rails  
plugins that make this easy). But storing the child keys in the parent  
DB record is just asking for trouble.

> regards  
> damian

## Best,

Marnen Laibow-Koser  
removed\_email\_address@domain.invalid  
[http://www.marnen.org](http://www.marnen.org)

---

<div class="post-metadata">

**Author:** ![judge](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/9de0a6/32.png) [@judge](https://www.ruby-forum.com/u/judge)\
**Post date:** [March 31, 2009, 10:47am UTC](https://www.ruby-forum.com/t/about-ar-relationship/164104/5 "2009-03-31T10:47:50Z")

</div>

Performance.

Lets, say you are listing a set of folders on a page and you want to  
display the number of files in each folder. So you would use  
something like

\<%= folder.files.size() %\>

With the classic foreign key relation then for every folder you will  
get an SQL query like “select count(files.id) from files where  
files.folder\_id = ‘#{folder.id}’” to determine the result of the size  
() method. This is no problem for 5 folders and a file table of a  
couple of thousand records but if you are displaying 30 folders and  
the file table contains 200 million records then its a performance  
bottleneck. You could add an index on the files.folder\_id to the  
files table to speed up each search but it will still take a while.

If the ‘folder.files’ element was an array of ids then there would be  
no subsequent database access to determine the size() value.

regards  
damian
