2011-06-16 96 views
2

有什么可以为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中实现这一点?

+0

只是为了澄清...你只是想暂时改变表名或永久改变表名吗? – Msencenb 2011-06-16 17:10:28

+0

永久性的,如同在这个模型中始终使用合格的表名。 – pazustep 2011-06-16 18:36:19

回答

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 

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表。