ruby-on-rails - 在 ActiveRecord::Schema 上切换连接

标签 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.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/

相关文章:

ruby-on-rails - Sinatra 和 ActiveRecord(无 Rails)——创建测试数据库

ruby-on-rails - 仅在生产环境中添加验证错误

ruby-on-rails - "Email has already been taken"错误与 capybara 和工厂女孩

mysql - ruby on Rails MySQL 服务器版本在 '? 附近使用正确的语法按sql查找

ruby-on-rails - 尝试使用 activerecord-postgis-adapter 构建数据库时未定义的方法

mysql - 如何使用 ActiveRecord 忽略 MySQL 索引?

ruby-on-rails - 用户名作为参数与黑名单验证

ruby-on-rails - 特定属性的 Ruby on Rails full_messages

ruby-on-rails - Rails事件模型从同一个表查询父子

ruby-on-rails - 如何通过从下拉列表中选择来更改 highcharts 数据值