Ruby on rails ActiveRecord::Base.build\u连接连接到错误的数据库

Ruby on rails ActiveRecord::Base.build\u连接连接到错误的数据库,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我创建了一个连接到2个数据库的类: class Production < ActiveRecord::Base ActiveRecord::Base.establish_connection(:production) self.abstract_class = true attr_accessor end class Backup < ActiveRecord::Base ActiveRecord::Base.establish_connection(:backup

我创建了一个连接到2个数据库的类:

class Production < ActiveRecord::Base
  ActiveRecord::Base.establish_connection(:production)
  self.abstract_class = true
  attr_accessor
end

class Backup < ActiveRecord::Base
  ActiveRecord::Base.establish_connection(:backup)
  self.abstract_class = true
  attr_accessor
end

class RepairReport
  def init

  end

  def repair_now
    Production.table_name = "users"
    users = Production.all
    users.each do |user|
      puts "USER: #{user.last_name}"
    end
  end
end
当我运行此命令时,它会给出一个错误:
ActiveRecord::AdapterNotSpecified:“未配置生产”数据库。可用:[“开发”、“测试”]

当我将
database.yml
更改为
development
test
时,它可以工作,但输出的用户来自另一个本地Rails应用程序中使用的另一个数据库。看来旧的连接仍处于活动状态?如何确保连接了正确的数据库

更新:

这是我现在更新的
数据库.yml
和代码(见下文),但它仍然连接到错误的数据库。当我删除
development
test
部分时,它返回:
ActiveRecord::AdapterNotSpecified:“development”数据库未配置。可用:[“开发产品”、“开发备份”]
,因此它似乎正在读取正确的
数据库.yml

development:
  adapter: postgresql
  encoding: unicode
  database: test_eagle_development
  host: localhost
  pool: 296
  username: postgres
  password: password1
  template: template0

test:
  adapter: postgresql
  encoding: unicode
  database: test_eagle_test
  host: localhost
  pool: 5
  username: postgres
  password: password1
  template: template0

development_prod:
  adapter: postgresql
  encoding: unicode
  database: test_eagle_development
  host: localhost
  pool: 296
  username: postgres
  password: password1
  template: template0

development_backup:
  adapter: postgresql
  encoding: unicode
  database: test_eagle_test
  host: localhost
  pool: 5
  username: postgres
  password: password1
  template: template0
和代码:

  class Production < ActiveRecord::Base
    ActiveRecord::Base.establish_connection("#{Rails.env}_prod".to_sym)
    self.abstract_class = true
    attr_accessor
  end

  class Backup < ActiveRecord::Base
    ActiveRecord::Base.establish_connection("#{Rails.env}_backup".to_sym)
    self.abstract_class = true
    attr_accessor
  end
类产品
看起来您正在以
开发模式运行rails应用程序。
默认情况下,rails尝试通过
rails\u ENV
value加载数据库配置并获取连接详细信息

我建议命名到两个匹配环境的连接:

开发:
适配器:postgresql
编码:unicode
数据库:test_eagle_开发
主机:本地主机
游泳池:296
用户名:postgres
密码:password1
模板:template0
开发和备份:
适配器:postgresql
编码:unicode
数据库:test\u eagle\u test
主机:本地主机
游泳池:5
用户名:postgres
密码:password1
模板:template0
类产品
看起来您正在以
开发模式运行rails应用程序。
默认情况下,rails尝试通过
rails\u ENV
value加载数据库配置并获取连接详细信息

我建议命名到两个匹配环境的连接:

开发:
适配器:postgresql
编码:unicode
数据库:test_eagle_开发
主机:本地主机
游泳池:296
用户名:postgres
密码:password1
模板:template0
开发和备份:
适配器:postgresql
编码:unicode
数据库:test\u eagle\u test
主机:本地主机
游泳池:5
用户名:postgres
密码:password1
模板:template0
类产品
必须是
建立连接(:生产)
而不是
ActiveRecord::Base。建立连接(:生产)


必须调用每个特定类的
:build\u connection
方法,而不是调用父类
ActiveRecord::Base
。配置父类没有意义)

它必须是
建立连接(:生产)
而不是
ActiveRecord::Base。建立连接(:生产)


必须调用每个特定类的
:build\u connection
方法,而不是调用父类
ActiveRecord::Base
。配置父类没有意义)

您可以尝试这个“#{Rails.env}_备份”。to#symI做了,但它仍然从错误的数据库返回数据,请参阅我的更新问题。您可以尝试这个“#{Rails.env}_备份”。to#symI做了,但它仍然从错误的数据库返回数据,请看我的最新问题。如果可以的话,我会给你们两个评分,所以我不得不选择。他在连接中使用
Rails.env
的解决方案帮助很大,他可以使用更多的积分。但问题不在于根据环境建立正确的连接,而在于正确的连接配置!你的代码没有如你所期望的那样工作,我说明了问题所在。另一个答案与您的问题无关当您显式地指定连接名称(正如您所做的那样)时,它是哪个环境并不重要。所以使用
Rails.env
并不能解决您的问题,它只是使您能够根据环境选择连接。最初的问题是“为什么设置的配置实际上不起作用”。如果可以的话,我会给你们两个评分,所以我不得不选择。他在连接中使用
Rails.env
的解决方案帮助很大,他可以使用更多的积分。但问题不在于根据环境建立正确的连接,而在于正确的连接配置!你的代码没有如你所期望的那样工作,我说明了问题所在。另一个答案与您的问题无关当您显式地指定连接名称(正如您所做的那样)时,它是哪个环境并不重要。所以使用
Rails.env
并不能解决您的问题,它只是使您能够根据环境选择连接。最初的问题是“为什么设置的配置实际上不起作用”。
  class Production < ActiveRecord::Base
    ActiveRecord::Base.establish_connection("#{Rails.env}_prod".to_sym)
    self.abstract_class = true
    attr_accessor
  end

  class Backup < ActiveRecord::Base
    ActiveRecord::Base.establish_connection("#{Rails.env}_backup".to_sym)
    self.abstract_class = true
    attr_accessor
  end