Rails 3和MySQL中的多个数据库模式
问题描述:
有什么可以为Rails 3中的ActiveRecord模型指定不同的模式?以下用于在Rails 2中工作:Rails 3和MySQL中的多个数据库模式
class Company < ActiveRecord::Base
set_table_name "hr.company"
end
这在Rails 3中失败,并带有消息Table myapp.hr.company doesn't exist
。
的简单模型下面的工作:
class Company < ActiveRecord::Base
establish_connection "hr"
set_table_name "company"
end
这种方法的问题是双重的:第一,Rails的创建这个模型单独的数据库连接,堂堂一个额外的开销。第二,所有的查询调用现在在这方面的背景下,这意味着任何联接回myapp
模式将打破:
class Company < ActiveRecord::Base
establish_connection "hr"
set_table_name "company"
has_many :widgets # widgets table resides in myapp schema
end
这反过来将失败,Table hr.widgets doesn't exist
。
那么,有没有什么办法可以在Rails 3中实现这一点?
答
您可以使用抽象类,继承它:
应用程序/模型/ db.rb
class Db < ActiveRecord::Base
establish_connection :db
self.abstract_class = true
end
应用程序/模型/ post.rb
class Post < Db
set_table_name :notes
belongs_to :user
end
app/models/user.rb
class User < ActiveRecord::Base
has_many :posts
end
配置/ database.yml的
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
db:
adapter: sqlite3
database: db/db.sqlite3
pool: 5
timeout: 5000
在db.sqlite3只有notes
表。
只是为了澄清...你只是想暂时改变表名或永久改变表名吗? – Msencenb 2011-06-16 17:10:28
永久性的,如同在这个模型中始终使用合格的表名。 – pazustep 2011-06-16 18:36:19