我的项目中有一个名为User的表,我想访问另一个现有项目的另一个数据库。 我想要访问的数据库它是一个项目的一部分,我需要为我的表用户提供访问权限。 原因是,我的表用户需要对一个用户库进行身份验证,在他们进行身份验证之后,他们将返回一个令牌,这样他们就可以访问另一个数据库。 我的表用户的database.yml配置如下:
default: &default
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
test:
<<: *default
database: db/test.sqlite3
production:
<<: *default
database: db/production.sqlite3
我要访问的另一个项目的数据库配置如下:
default: &default
adapter: mysql2
encoding: utf8mb4
collation: utf8mb4_bin
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
variables:
sql_mode: TRADITIONAL
development:
<<: *default
username: root
password:
database: <company_name>dev
test:
<<: *default
database: <company_name>_test
username: root
password:
production:
<<: *default
database: <%= ENV['RDS_DB_NAME'] %>
username: <%= ENV['RDS_USERNAME'] %>
password: <%= ENV['RDS_PASSWORD'] %>
host: <%= ENV['RDS_HOSTNAME'] %>
port: <%= ENV['RDS_PORT'] %>
我该如何解决这个问题呢?
您可以在第一个配置中添加另一个数据库(根据需要调整,我只是从第二个中复制了您的配置):
...
other:
adapter: mysql2
encoding: utf8mb4
collation: utf8mb4_bin
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
variables:
sql_mode: TRADITIONAL
database: <%= ENV['RDS_DB_NAME'] %>
username: <%= ENV['RDS_USERNAME'] %>
password: <%= ENV['RDS_PASSWORD'] %>
host: <%= ENV['RDS_HOSTNAME'] %>
port: <%= ENV['RDS_PORT'] %>
然后,您可以在app/models
目录中创建一个子文件夹,以便向ActiveRecord
您提供对其他数据库的访问权限。 首先创建一个基类:
# app/models/other/base.rb
module Other
class Base < ActiveRecord::Base
establish_connection configurations['other']
self.abstract_class = true
end
end
然后在该模块中添加用户模型:
# app/models/other/user.rb
module Other
class User < Base
self.table_name = 'users'
self.primary_key = 'id'
end
end
现在,您可以像这样引用“Other”用户表:
Other::User.find(other_user_id)
还要记住,您需要在第一个项目的GEMFile中安装mysql2
数据库适配器。
还要注意,您可能需要一个比“other”更好的名称/模块,我只是在这里用它作为示例。