我正在使用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?)
答案 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
我意识到这个答案可能是一年太晚了!但它可能仍然对某人有用。