# DRY naming, or polymorphic join models

**URL:** <https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273>\
**Category:** Rails\
**Created:** [February 12, 2007, 7:55am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273 "2007-02-12T07:55:24Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 12, 2007, 7:55am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/1 "2007-02-12T07:55:24Z")

</div>

I need to DRY up some of my tables. Here is the situation: I have a  
number of objects that habtm name objects. What I need is some kind  
of polymorphic join model so each object can relate to the same names  
table. An example:

oranges table  
orange row  
orange row  
…

apples table  
apple row  
apple row  
…

names table  
valencia  
red delicious  
gala  
navel  
blood orange  
…

I need to break the names out because some of the oranges or apples  
have different names, but the same other data. Am I stuck with a  
names table and join model for each fruit, or can I do something  
tricky with has\_many :through and meta-data?  
TIA,  
–Dean

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 12, 2007, 7:46pm UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/2 "2007-02-12T19:46:50Z")

</div>

What about single-table inheritance (STI)? It would allow you do  
something  
like the following:

fruits table

- name
- color
- type (Orange, Apple, etc.)

class Fruit \< ActiveRecord::Base; end  
class Apple \< Fruit; end  
class Orange \< Fruit; end

More information here:

> **[ActiveRecord::Base](https://api.rubyonrails.org/classes/ActiveRecord/Base.html)**
>
> Active Record Active Record objects don't specify their attributes directly, but rather infer them from the table definition with which they're linked.

[http://wiki.rubyonrails.org/rails/pages/SingleTableInheritance](http://wiki.rubyonrails.org/rails/pages/SingleTableInheritance)  
[http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html](http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html)

On 2/12/07, Dean [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> …  
> navel
> 
> >

–  
Michael G.

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 13, 2007, 6:15am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/3 "2007-02-13T06:15:12Z")

</div>

On Feb 12, 10:45 am, “Michael G.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> class Orange \< Fruit; end  
> I thought about that, but I have way too much information about my  
> “fruits” plus five different types of “fruit” to mash into one table.  
> I may have to hack together some cool join model.  
> –Dean

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 13, 2007, 9:16am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/4 "2007-02-13T09:16:26Z")

</div>

Don’t try to break shared columns out into their own table. It’s a  
significant complication for no performance gain.

Just use Single Table Inheritance or Polymorphic Associations,  
dpeending on what you’re trying to do. We can’t tell what’s  
appropriate, because you only described your twisted data structure,  
without telling us what you’re trying to model. 🙂

Ciao,  
Sheldon.

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 14, 2007, 6:24am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/5 "2007-02-14T06:24:38Z")

</div>

On Feb 13, 12:16 am, “Sheldon H.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> P.S.: It’s probably a mistake to produce one class per type of fruit.  
> Chances are, you can model them all using a single Fruit class.
> 
> Encapsulate the concept that varies.
> 
> Ciao,  
> Sheldon.

Sorry for the obfuscation, I am just being paranoid. I am modeling  
ingredients to a recipe for making beer.

There are five things that go into beer: fermentables, hops, extras,  
yeast and water. Each ingredient provides different things to a  
recipe. For example, the join model between recipes and fermentables  
contains an amount, potential and color. Hops provide boil time,  
amount, bitterness and form. Each ingredient has different  
information in the join model. Furthermore, if I made a single table  
out of all five ingredient types it would have between 60 and 75  
columns.

I was able to build a single controller for all 5 ingredients until I  
came to the hops. Some of them have different names, so that meant  
using a specialized controller just for them. I would like to get all  
my ingredients modeled the same way so I can avoid that.

Thanks for the help.  
–Dean

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 13, 2007, 9:17am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/6 "2007-02-13T09:17:26Z")

</div>

P.S.: It’s probably a mistake to produce one class per type of fruit.  
Chances are, you can model them all using a single Fruit class.

Encapsulate the concept that varies.

Ciao,  
Sheldon.

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 16, 2007, 2:37pm UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/7 "2007-02-16T14:37:44Z")

</div>

Ah, okay. So it sounds like you’d be very well served indeed by a  
polymorphic association.

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 19, 2007, 4:04am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/8 "2007-02-19T04:04:41Z")

</div>

On Feb 16, 5:36 am, “Sheldon H.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ah, okay. So it sounds like you’d be very well served indeed by a  
> polymorphic association.

😃

And I will run into the same problem when I go to implement the  
Retailers model and who sells which ingredient for how much. Gah!

Could someone tell me what would be involved in creating a polymorphic  
join model? I have enough knowledge of Ruby to kludge something  
together by copying from the available polymorphic associations.

Is a polymorphic join model actually feasible?

Will anyone else find this useful?

Regards,  
–Dean

---

<div class="post-metadata">

**Author:** ![dean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3be4f8/32.png) [@dean](https://www.ruby-forum.com/u/dean)\
**Post date:** [February 19, 2007, 4:53am UTC](https://www.ruby-forum.com/t/dry-naming-or-polymorphic-join-models/85273/9 "2007-02-19T04:53:44Z")

</div>

On Feb 18, 7:03 pm, “Dean” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Could someone tell me what would be involved in creating a polymorphic  
> join model? I have enough knowledge of Ruby to kludge something  
> together by copying from the available polymorphic associations.

Looks like Evan W. has already implemented this.

> **[has\_many\_polymorphs bugfix release](https://blog.evanweaver.com/2006/11/29/has_many_polymorphs-bugfix-release/)**
>
> Get version 18 from the usual place.update Now also fixed a bug where doubly polymorphic parents weren’t being strict about which children they returned (thanks to Xardion and Agile for the discove…

I will take a closer look. Thanks to Evan.

–Dean
