在ActiveRecord :: Schema上切换连接

时间:2011-01-20 02:47:48

标签: ruby-on-rails

我正在使用rails 2.3.5和mysql。

我有一个型号TableA和另一个型号TableB。 TableA完全正常..但我需要为TableB交换连接。我正在连接到其他地方的其他服务器,所以我必须检查该表是否存在。如果没有,我将创建一个新表。

TableB.establish_connection(new_database_params)
unless TableB.table_exists?
  ActiveRecord::Base.establish_connection(new_database_params)
  ActiveRecord::Schema.define do
    create_table :table_bs do |t|
      t.column :text, :string
    end
  end
  ActiveRecord::Base.establish_connection("#{RAILS_ENV}")      
end

我注意到TableB.establish_connection(new_database_params)将我连接到新服务器。那完全没问题。

当我尝试创建一个新表时,我仍然需要调用ActiveRecord :: Base来交换连接。有没有办法在ActiveRecord :: Schema上交换连接? (类似于Model.establish_connection?)

1 个答案:

答案 0 :(得分:8)

从概念上讲,我遇到了完全相同的问题。我想继承ActiveRecord :: Base并为该连接构建架构。我花了很长时间才弄清楚,还有很多潜入ActiveRecord :: Base,Schema和Migration,但我找到了一个有效的解决方案,而且非常简单。

在底层,Schema是Migration的子类,它在您提供的块上调用instance_eval。因此,我们属于Migration类的范围,可以将它的@connection实例变量更改为ActiveRecord :: Base子类的连接,即

ActiveRecord::Schema.define do
  @connection = TableB.connection
  create_table :table_bs do |t|
    t.column :text, :string
  end
end

我意识到这个答案可能是一年太晚了!但它可能仍然对某人有用。