# Overriding has\_many :through

**URL:** <https://www.ruby-forum.com/t/overriding-has-many-through/142473>\
**Category:** Rails\
**Created:** [July 8, 2008, 11:00am UTC](https://www.ruby-forum.com/t/overriding-has-many-through/142473 "2008-07-08T11:00:38Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![richardfairhurst](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/c37758/32.png) [@richardfairhurst](https://www.ruby-forum.com/u/richardfairhurst)\
**Post date:** [July 8, 2008, 11:00am UTC](https://www.ruby-forum.com/t/overriding-has-many-through/142473/1 "2008-07-08T11:00:38Z")

</div>

Hi!

I have two classes, ‘node’ and ‘way’, linked by ‘way\_node’. It’s a  
fairly straightforward relationship:

node:  
has\_many :way\_nodes  
has\_many :ways, :through =\> :way\_nodes

way:  
has\_many :way\_nodes, :foreign\_key =\> ‘id’, :order =\> ‘sequence\_id’  
has\_many :nodes, :through =\> :way\_nodes, :order =\> ‘sequence\_id’

way\_node:  
belongs\_to :node  
belongs\_to :way, :foreign\_key =\> :id

This typically results in queries like:  
SELECT [blah] FROM nodes  
LEFT OUTER JOIN way\_nodes ON (nodes.id = way\_nodes.node\_id)  
LEFT OUTER JOIN ways ON (ways.id = way\_nodes.id)

However, for one single query in the app, I’d like to join via a  
different table. In other words:  
SELECT [blah] FROM nodes  
LEFT OUTER JOIN new\_table ON (nodes.id = new\_table.node\_id)  
LEFT OUTER JOIN ways ON (ways.id = new\_table.id)

Is there any way of doing this? I’d wondered about the :joins option in  
‘find’, but it only adds additional joins, rather than replacing the  
existing ones.

Thanks for any help!

cheers  
Richard

---

<div class="post-metadata">

**Author:** ![richardfairhurst](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/c37758/32.png) [@richardfairhurst](https://www.ruby-forum.com/u/richardfairhurst)\
**Post date:** [July 8, 2008, 4:52pm UTC](https://www.ruby-forum.com/t/overriding-has-many-through/142473/2 "2008-07-08T16:52:44Z")

</div>

How about

has\_many :ways2, :class\_name =\> “Way”, :through =\> :new\_ways

You’d need another model for new\_ways and appropriate associations to  
way.

---

<div class="post-metadata">

**Author:** ![richardfairhurst](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/c37758/32.png) [@richardfairhurst](https://www.ruby-forum.com/u/richardfairhurst)\
**Post date:** [July 9, 2008, 11:34am UTC](https://www.ruby-forum.com/t/overriding-has-many-through/142473/3 "2008-07-09T11:34:55Z")

</div>

Thanks - after another suggestion I ended up doing something very  
similar:

node.rb:  
has\_many :old\_way\_nodes  
has\_many :ways\_via\_history, :class\_name=\> “Way”, :through =\>  
:old\_way\_nodes, :source =\> :way

old\_way\_node.rb:  
belongs\_to :way, :foreign\_key=\> :id

The :source meant I didn’t even have to set up a new model.
