当使用多个数据库时,Rails会在错误的数据库中搜索模型数据



我正在Rails中构建一个需要访问多个SQL数据库的应用程序。我在网上找到的资源建议我使用ActiveRecord::Base.establish_connection,然而,这似乎干扰了我网站的模型。在连接到另一个数据库后,当我下一次执行<model>.<command>时,它会给我Mysql2::Error: Table '<Database I had to access through establish_connection>.<Model's table>' doesn't exist,例如:Mysql2::Error: Table 'test.words' doesn't exist,这意味着rails试图在我必须通过establish_connection而不是站点开发数据库访问的数据库中查找与其模型相关的表。

重现错误的步骤:

以下是我发现的一些步骤,它们似乎重现了这个问题;

首先,我创建了一个新的rails应用程序:

rails new sqldbtest -d mysql
cd sqldbtest

然后我设置了配置文件:

default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: <omitted>
host: localhost

然后在mysql数据库中创建一个控制器、模型和一些数据:

rails generate controller test test
rails generate model Word name:string txt:text
rails db:create
rails db:migrate
rails c
cat=Word.new
cat.name="Cat"
cat.txt="Cat."
cat.save
exit
mysql -u root -p # I already have a database called "test".
use test;
create table extst (id int primary key, name varchar(8), txt text);
insert into extst (id,name,txt) values (0,"Bob","Bob.");
quit

然后我制作了控制器和视图:

class TestController < ApplicationController
def test
itemOne=Word.find_by(name:"Cat")
@textOne=itemOne.txt
con=ActiveRecord::Base.establish_connection(adapter: 'mysql2', encoding: 'utf8mb4', username: 'root', password: <omitted>, host: 'localhost', database: 'test').connection
@textTwo=con.execute('select txt from extst where name="Bob"').to_a[0][0]
end
end

我在视图中写道:

<%= @textOne %><br>
<%= @textTwo %>

添加了"根";测试#测试"到config/routes.rb

rails s

结果:

当我加载页面时;Cat"以及";鲍勃"按预期在单独的行上,但当我刷新时,它会显示如上所述的错误。

我已经尝试将con.close添加到控制器中,但这不起作用。

由于这个错误来自于连接到另一个数据库,在@textTwo=con.execute('select txt from extst where name="Bob"').to_a[0][0]之后将ActiveRecord::Base.establish_connection(adapter: 'mysql2', encoding: 'utf8mb4', username: 'root', password: <omitted>, host: 'localhost', database: 'sqldbtest_development').connection添加到控制器可以阻止错误的发生,但我不知道这是否是最佳做法,也不知道它是否有任何副作用。例如,在转移到测试或生产时,需要更改数据库。

这个解决方案很可能只是一个临时的解决方案。

最新更新