在ShowNearby,我们一直在从PHP迁移到RoR 3.1,我们面临着一些问题,可能是你们之前已经解决过的问题。
我们有大量数据,我们决定将数据库分成几个可以单独处理的数据库。例如,我们的帐户,地点,日志和其他帐户被拆分为多个数据库
我们需要让迁移,固定装置,模型更好地发挥作用,到目前为止它已经非常混乱了。我们对解决方案的一些要求是可以接受的:
我们正在考虑为每个数据库设置单独的rails项目并将它们与ActiveResource连接,但我们认为这不是非常有效。你们之前有没有遇到过类似的问题?
非常感谢!!
答案 0 :(得分:142)
对于Wukerplank的回答,您也可以像往常一样将连接详细信息放在database.yml中,其名称如下:
log_database_production:
adapter: mysql
host: other_host
username: logmein
password: supersecret
database: logs
然后在你的特殊模特中:
class AccessLog < ActiveRecord::Base
establish_connection "log_database_#{Rails.env}".to_sym
end
将这些讨厌的凭据保留在您的应用程序代码中。
编辑:如果要在多个模型中重用此连接,则应创建一个新的抽象类并从中继承,因为连接与类紧密耦合(如here所述,here和here),并为每个类创建新的连接。
如果是这种情况,请按以下方式进行设置:
class LogDatabase < ActiveRecord::Base
self.abstract_class = true
establish_connection "log_database_#{Rails.env}".to_sym
end
class AccessLog < LogDatabase
end
class CheckoutLog < LogDatabase
end
答案 1 :(得分:18)
连接到不同的数据库非常简单:
# model in the "default" database from database.yml
class Person < ActiveRecord::Base
# ... your stuff here
end
# model in a different database
class Place < ActiveRecord::Base
establish_connection (
:adapter => "mysql",
:host => "other_host",
:username => "username",
:password => "password",
:database => "other_db"
)
end
我会担心设置多个Rails项目,因为你会为控制器的数据检索增加很多开销,这可能会让事情变得缓慢。
至于你关于迁移,固定装置,模型等的问题:我认为不会有一个简单的方法,所以请发布单独的问题并尽可能具体。
将DB合并为一个不是一个选项?它会让你的生活更轻松!
答案 2 :(得分:11)
发现了一篇很棒的帖子,可以指出其他人以正确的方式执行此检查http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html
设置如下:
database.yml(db config file)
support_development:
adapter: blah
database: blah
username: blah
password: blah
support_base.rb(模型文件)
class SupportBase < ActiveRecord::Base
self.abstract_class = true #important!
establish_connection("support_development")
end
tst_test.rb(模型文件)
class TstTest < SupportBase
#SupportBase not ActiveRecord is important!
self.table_name = 'tst_test'
def self.get_test_name(id)
if id = nil
return ''
else
query = "select tst_name from tst_test where tst_id = \'#{id}\'"
tst = connection.select_all(query) #select_all is important!
return tst[0].fetch('tst_name')
end
end
end
PS,这真的不包括迁移,我不认为你可以用rake在多个DB上进行迁移(虽然我不确定那是一个很难'不能做',但这可能是可能的) 。这只是连接和查询您无法控制的其他DB的好方法。
答案 3 :(得分:5)
您可能还想附加Rails环境,因此您的开发和测试数据库不一样。
establish_connection "legacy_#{Rails.env}"
答案 4 :(得分:3)
following article建议定义新的Rake任务以实现针对多个数据库的迁移。每个任务都建立自己的连接,然后使用此连接和特定数据库文件夹执行迁移。
它还定义了一个熟悉的db:migrate
来调用另外两个任务。
包括此处,此链接变得不可用:
desc "Migrate the database through scripts in db/migrate directory."
namespace :db do
task :migrate do
Rake::Task["db:migrate_db1"].invoke
Rake::Task["db:migrate_db2"].invoke
end
task :migrate_db1 do
ActiveRecord::Base.establish_connection DB1_CONF
ActiveRecord::Migrator.migrate("db/migrate/db1/")
end
task :migrate_db2 do
ActiveRecord::Base.establish_connection DB2_CONF
ActiveRecord::Migrator.migrate("db/migrate/db2/")
end
end
来源: Ruby on Rails Connect to Multiple Databases and Migrations
答案 5 :(得分:1)
嘿,这篇文章已经过时了,但我找到了一个可以帮助其他人的Rails 3.2解决方案。 https://stackoverflow.com/a/16542724/1447654