提问者:小点点

如何在Ruby on Rails中连接到现有数据库


我的项目中有一个名为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'] %>

我该如何解决这个问题呢?


共1个答案

匿名用户

您可以在第一个配置中添加另一个数据库(根据需要调整,我只是从第二个中复制了您的配置):

...

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”更好的名称/模块,我只是在这里用它作为示例。