# Changing tables within rails app

**URL:** <https://www.ruby-forum.com/t/changing-tables-within-rails-app/88973>\
**Category:** Rails\
**Created:** [January 3, 2006, 7:00pm UTC](https://www.ruby-forum.com/t/changing-tables-within-rails-app/88973 "2006-01-03T19:00:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [January 3, 2006, 7:00pm UTC](https://www.ruby-forum.com/t/changing-tables-within-rails-app/88973/1 "2006-01-03T19:00:24Z")

</div>

Hi,

I want to know if my idea is possible within the rails framework.

I want to write a rails app that uses the same code to manage two  
classes of widgets; “wired widgets” and “wireless widgets”.

For the most part, all the code to manage these two classes of widgets  
will be identical. The only differing part are some of the underlying  
field names in each respective db table (table: wired\_widgets vs.  
wireless\_widgets).

In an effort to reduce code repetition and take advantage of db table  
reflection, I want to share the same code base and just change which  
table is being used.

I envision a select menu in the app to toggle between the  
‘wired\_widgets’ and ‘wireless\_widgets’ tables. And subsequently the  
reflective view,edit,create pages would reflect the slightly differing  
db fields.

Does anyone know of a clever way to do such a thing within rails?

Thank you for any help.

Matt

–  
Matt C. Wagner  
Information Security Analyst

Network Intrusion Detection  
Security Operations Center  
Corporate Information Security  
Wells Fargo Bank

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [January 3, 2006, 7:00pm UTC](https://www.ruby-forum.com/t/changing-tables-within-rails-app/88973/2 "2006-01-03T19:00:28Z")

</div>

Why not just make “wired” and “wireless” widgets properties of the  
widget if  
they contain the same info?

On 1/3/06, removed\_email\_address@domain.invalid [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> field names in each respective db table (table: wired\_widgets vs.
> 
> Network Intrusion Detection  
> Security Operations Center  
> Corporate Information Security  
> Wells Fargo Bank
> 
> * * *
> 
> Rails mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

–  
Steven R.  
web application & interface developer  
[http://www.zerium.com](http://www.zerium.com)  
[phone] 404-488-4364

---

<div class="post-metadata">

**Author:** ![unknown](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/u/4bbf92/32.png) [@unknown](https://www.ruby-forum.com/u/unknown)\
**Post date:** [January 3, 2006, 7:00pm UTC](https://www.ruby-forum.com/t/changing-tables-within-rails-app/88973/3 "2006-01-03T19:00:32Z")

</div>

Hi Matt,

You can use the Single Table Inheritance pattern w/ this one:

Database: table “widgets” (w/ all wired and unwired fields, plus “type”  
column)  
Models: “WiredWidget \< Widget”, “UnwiredWidget \< Widget” and “Widget \<  
ActiveRecord::Base”

Since STI has all fields for all “children” tables, your UnwiredWidget  
model will have the same fields as WiredWidget ones. A quick-and-dirty  
solution is to override the column\_names method for ActiveRecord. So,  
you can have something like this:

class Widget \< ActiveRecord::Base

def column\_names  
[“some field”, “other field”, …] if type == “WiredWidget”  
[“some unwired field”, “other unwired field”, …] if type ==  
“UnwiredWidget”  
end

end

–  
juca
