# \[2.3.5\] How can I tell a model to use a specific DB and table?

**URL:** <https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585>\
**Category:** Rails\
**Created:** [March 4, 2010, 9:34pm UTC](https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585 "2010-03-04T21:34:05Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Phoenix\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/5e9695/32.png) [@Phoenix\_R](https://www.ruby-forum.com/u/Phoenix_R)\
**Post date:** [March 4, 2010, 9:34pm UTC](https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585/1 "2010-03-04T21:34:05Z")

</div>

So I have these two databases:

- Website
- Company Intranet

I’ve built the DB and schema for the company intranet application to  
allow certain users (authenticated by AD within my rails app) to input  
data that will then be brought over to the first database (company  
public-facing website) when a rake task is run. That’s the idea,  
anyway.

There is going to be a LOT of overlap between the two databases and  
their schemas. For example, both databases have a table named  
“jobs”. So I’m trying to use multiple ActiveRecord connections to  
move data from the company intranet database to the website database  
without resorting to raw SQL.

So I have a Job class on the company intranet app:  
class Job \< ActiveRecord::Base

# …

end

And one for the company website - it’s in the company intranet  
application, but it’s a different model:  
class WebsiteJob \< ActiveRecord::Base  
ActiveRecord::Base.establish\_connection(“website\_#{RAILS\_ENV}”)  
set\_table\_name “jobs”

# …

end

As you might be able to see, I’m running into a bit of a collision  
here. If I fire up script/console and call:

> > Job.first

I wind up with a Job from the right database (the “company intranet”  
database). However, if I call:

> > CompanyJob.delete\_all # purge stale crap that nobody needs  
> > Job.first

It queries the FIRST database, the one that the CompanyJob model  
connects to. It seems to be switching the default connection behind  
the scenes and I’m not sure how to override that.

I tried manually assigning the ActiveRecord connection for the right  
database to the Job model, but it still exhibits this exact same  
behavior.

Does anyone know how I can force Rails to use the remote/other DB ONLY  
for that specific model, regardless of the fact that both databases  
contain identically named tables (that I’m unable to change)?

Thanks.

---

<div class="post-metadata">

**Author:** ![Phoenix\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/5e9695/32.png) [@Phoenix\_R](https://www.ruby-forum.com/u/Phoenix_R)\
**Post date:** [March 4, 2010, 9:59pm UTC](https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585/2 "2010-03-04T21:59:16Z")

</div>

On 4 March 2010 15:33, Phoenix R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > > Job.first  
> > > I tried manually assigning the ActiveRecord connection for the right  
> > > database to the Job model, but it still exhibits this exact same  
> > > behavior.
> 
> Does anyone know how I can force Rails to use the remote/other DB ONLY  
> for that specific model, regardless of the fact that both databases  
> contain identically named tables (that I’m unable to change)?

Might this be a symptom of poor design?

Share with us the tables for both databases.

> [http://groups.google.com/group/rubyonrails-talk?hl=en](http://groups.google.com/group/rubyonrails-talk?hl=en).

–  
Charles A. Lopez  
removed\_email\_address@domain.invalid

What’s your vision for your organization?  
What’s your biggest challenge?

Let’s talk.  
(IBM Partner)

---

<div class="post-metadata">

**Author:** ![Phoenix\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/5e9695/32.png) [@Phoenix\_R](https://www.ruby-forum.com/u/Phoenix_R)\
**Post date:** [March 4, 2010, 10:14pm UTC](https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585/3 "2010-03-04T22:14:29Z")

</div>

Hey Charles, thanks for the feedback.

## In the company intranet database we have:

DESCRIBE jobs;  
id  
title  
category  
status  
city  
state\_id  
zip\_code  
description  
qualifications  
education  
experience  
application\_link  
store\_id  
created\_at  
updated\_at

# In the company website database, we have:

DESCRIBE jobs;  
id  
title  
category\_id  
city  
state  
zip  
status\_id  
description  
qualifications  
required\_skills  
required\_education  
application\_link  
created\_at  
updated\_at

## So as you can see, they’re very similar, though there are some discrepancies. The \_id fields: In the portal DB:

- store\_id : FK to a “stores” table, so HR personnel can just select  
the store that the job is located at, and not have to enter city/state/  
zip unless it’s at a location we don’t have in our system yet  
(intranet portal only)

## In the website DB:

- category\_id = FK to a “job\_categories” table where we have entries  
like “Accounting”, “IT”, “HR”, etc. - designed to prevent duplication  
of those text labels
- status\_id = FK to a “job\_statuses” table where there are entries  
like “Full Time”, “Part Time”, “Seasonal”, etc., again to prevent  
duplication

Unfortunately I’m unable to change the “website” database structure to  
match that of the “portal” structure; I can do this all with raw SQL  
(in fact I had a rake task finished that does it that way), but I’d  
prefer to do it using ActiveRecord, as the syntax is much shorter.

I’m 99.99999% sure that the problem lies in the fact that the tables  
have the same name, even though they’re in different databases. If I  
don’t call methods on any of the “remote” classes I have set up,  
everything works perfectly, but if I call one of those remote classes,  
and then make a call to the Job model, everything goes to hell in a  
handbasket, complaining, for example, that the column ‘category’  
doesn’t exist in the table. It does exist on the table, just _in a  
different database_.

---

<div class="post-metadata">

**Author:** ![Phoenix\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/5e9695/32.png) [@Phoenix\_R](https://www.ruby-forum.com/u/Phoenix_R)\
**Post date:** [March 4, 2010, 10:33pm UTC](https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585/4 "2010-03-04T22:33:48Z")

</div>

On Mar 4, 8:33 pm, Phoenix R. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> It queries the FIRST database, the one that the CompanyJob model  
> connects to. It seems to be switching the default connection behind  
> the scenes and I’m not sure how to override that.

It’s switching the default connection because you’re asking it to -  
you’re calling establish\_connection on ActiveRecord::Base. You should  
just be calling it on the class you want to change.

Fred

---

<div class="post-metadata">

**Author:** ![Phoenix\_R](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/5e9695/32.png) [@Phoenix\_R](https://www.ruby-forum.com/u/Phoenix_R)\
**Post date:** [March 4, 2010, 10:56pm UTC](https://www.ruby-forum.com/t/2-3-5-how-can-i-tell-a-model-to-use-a-specific-db-and-table/184585/5 "2010-03-04T22:56:02Z")

</div>

Fred, as always, you are the man. Thanks for idiot checking me!

For any searchers/googlers with the same issue:

# THIS IS WRONG

class Something \< ActiveRecord::Base

ActiveRecord::Base.establish\_connection(“name\_of\_your\_database\_dot\_yml\_connection”)

# …

end

# This appears right

class Something \< ActiveRecord::Base  
self.establish\_connection(“name\_of\_connection\_in\_database\_dot\_yml”)

# …

end

On Mar 4, 2:32 pm, Frederick C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
