【问题标题】:Switching connection on ActiveRecord::Schema在 ActiveRecord::Schema 上切换连接
【发布时间】:2011-01-20 02:47:48
【问题描述】:

我正在使用 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?)

【问题讨论】:

  • 你找到这个答案了吗?我正在尝试实现完全相同的目标。

标签: ruby-on-rails


【解决方案1】:

从概念上讲,我遇到了完全相同的问题。我想继承 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

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

【讨论】:

  • 7 年后仍然有用!
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2016-03-14
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多