Rails 3和MySQL中的多个数据库模式

时间:2011-06-16 16:51:15

标签: mysql ruby-on-rails ruby-on-rails-3

是否有任何为Rails 3中的ActiveRecord模型指定不同的架构?以下用于在Rails 2中工作:

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中实现这个目标?

1 个答案:

答案 0 :(得分:1)

您可以使用抽象类并从中继承:

应用/模型/ 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

应用/模型/ 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表。