我使用的是 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.built_connection(new_database_params) 将我连接到新服务器。那完全没问题。
当我尝试创建新表时,我仍然需要调用 ActiveRecord::Base 来交换连接。有没有办法交换 ActiveRecord::Schema 上的连接? (类似于Model.built_connection?)
最佳答案
从概念上讲,我遇到了完全相同的问题。我想继承 ActiveRecord::Base 并为该连接构建一个架构。我花了很长时间才弄清楚,并且深入研究了 ActiveRecord::Base、Schema 和 Migration,但我找到了一个有效的解决方案,而且非常简单。
在底层,Schema 是 Migration 的子类,它在您提供的 block 上调用 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
我意识到这个答案可能已经晚了一年!但它可能对某人仍然有用。
关于ruby-on-rails - 在 ActiveRecord::Schema 上切换连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4743007/