forked from peppyheppy/use_db
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathREADME
86 lines (64 loc) · 2.54 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
UseDb
by David Stevenson
=====
USAGE
This plugin allows you to use multiple databases in your rails application.
You can switch the database for a model in the following manner:
class MyModel < ActiveRecord::Base
use_db :prefix => "secdb_", :suffix => "_cool"
end
"use_db" takes a prefix and a suffix (only 1 of which is required) which are prepended and appended onto the current RAILS_ENV.
In the above example, I would have to make the following database entries to my database.yml:
secdb_development_cool:
adapter: mysql
database: secdb_dev_db
...
secdb_test_cool:
adapater: mysql
database: secdb_test_db
...
It's often useful to create a single abstract model which all models using a different database extend from:
class SecdbBase < ActiveRecord::Base
use_db :prefix => "secdb_"
self.abstract_class = true
end
class MyModel < SecdbBase
# this model will use a different database automatically now
end
==========
MIGRATIONS
To write a migration which executes on a different database, add the following method to your
migration:
class MyMigration < ActiveRecord::Migration
def self.database_model
return "SecdbBase"
end
def self.up
...
end
...
end
The "self.database_model" call must return a string which is the name of the model whose connection
you want to borrow when performing the migration. If this method is undefined, the default ActiveRecord::Base
connection is used.
=======
TESTING
In order to test multiple databases, you must invoke a task which clones the development database
structure and copies it into the test database, clearing out the existing test data. There is a single
helper method which executes this task and you invoke it as follows:
UseDbTest.prepare_test_db(:prefix => "secdb_")
Even though it might not be the best place for it, I often place a call to this in my test helper.
You don't want it to execute for every test, so put the following guards around it:
unless defined?(CLONED_SEC_DB_FOR_TEST)
UseDbTest.prepare_test_db(:prefix => "secdb_")
CLONED_SEC_DB_FOR_TEST = true
end
========
FIXTURES
Fixtures will automatically be loaded into the correct database as long as the fixture name corresponds
to the name of a model. For example, if I have a model called SecdbUser who uses a different database and
I create a fixture file called secdb_users.yml, the fixture loader will use whatever database connection
belongs to hte SecdbUser model.
There is currently no other way to force a fixture to use a specific database (sorry, no join tables yet),
like there is for migrations.