Ruby on rails ActiveRecord正在重置以前定义的所有变量

Ruby on rails ActiveRecord正在重置以前定义的所有变量,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我正在构建一个rake任务,以便在两个数据库之间迁移一些数据。它们的结构完全相同。我的任务是: namespace :oab_nexus_migration do task :start, [:oab_user, :nexus_user] => :environment do |t, args| oab_account = User.find_by_username(args[:oab_user]).main_account oab_trials

我正在构建一个rake任务,以便在两个数据库之间迁移一些数据。它们的结构完全相同。我的任务是:

namespace :oab_nexus_migration do
  task :start, [:oab_user, :nexus_user] => :environment do |t, args|
    oab_account      = User.find_by_username(args[:oab_user]).main_account

    oab_trials       = oab_account.trials.includes(:parts)
    oab_schedules    = oab_account.schedules
    oab_movements    = oab_account.movements
    oab_annotations  = oab_account.annotations
    oab_hearings     = oab_account.hearings
    oab_publications = oab_account.publications
    oab_tasks        = oab_account.tasks
    oab_people       = oab_account.people.includes(:addresses, :internet_addresses, :phones)

    ActiveRecord::Base.establish_connection(:other_database)

    ...
    More code here
  end
end
该任务通过以下方式执行:

RAILS\u ENV=production rake oab\u nexus\u迁移:开始[user\u one,user\u two]

在从数据库1检索到我需要的所有信息之后,我需要将其插入数据库2中。但一些非常奇怪的事情正在发生。例如,如果我在
建立连接之前调用
p oab_trials
(或任何其他变量),则所有值都在那里,由一个大数组表示。但是如果我尝试在
建立\u连接
之后调用它,则返回的值是一个空数组。似乎ActiveRecord正在重置我以前定义的所有变量


这里发生了什么

oab\u account.trials.includes(:parts)
不存储值,它存储对延迟计算的
ActiveRecord::Relation
的引用


因此,这并不是说
ActiveRecord
正在重置变量的值,而是说,当您连接到第二个数据库时,您正在将引用更改为空集合。

您正在引用的相关集合是
ActiveRecord::Relation
的延迟计算实例。如果数据库连接中途更改,则延迟计算不起作用

在切换连接之前,需要先将这些关系加载到内存中。调用
.to_a
对关系强制执行此操作

oab_account      = User.find_by_username(args[:oab_user]).main_account

oab_trials       = oab_account.trials.includes(:parts).to_a
oab_schedules    = oab_account.schedules.to_a
oab_movements    = oab_account.movements.to_a
oab_annotations  = oab_account.annotations.to_a
oab_hearings     = oab_account.hearings.to_a
oab_publications = oab_account.publications.to_a
oab_tasks        = oab_account.tasks.to_a
oab_people       = oab_account.people.includes(:addresses, :internet_addresses, :phones).to_a

您可能希望制作两个不同但相似的模型来传输数据,每个数据库一个。