Как установить соединение с несколькими базами данных с помощью одного адаптера (postgres), используя гем active_record? - PullRequest
0 голосов
/ 11 февраля 2019

как дела?У меня были некоторые проблемы, когда я пытаюсь установить соединение с двумя базами данных в postres.Я постараюсь описать сценарий:

Это мой pg.yml:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: localhost
  user: xxxxx
  password: xxxxx

development:
  <<: *default
  database: not_legacy

legacy:
  <<: *default
  database: legacy

Это мой Legacy :: Базовый класс:

#/models/legacy/base.rb

require 'active_record'
require 'erb'

module Legacy
  class Base < ActiveRecord::Base
    self.abstract_class = true

    conf_contents = File.read('config/pg.yml')
    conf_evaluated = ::ERB.new(conf_contents).result
    conf = YAML.load(conf_evaluated)

    ActiveRecord::Base.establish_connection conf['legacy']
  end
end

и этомой класс NotLegacy :: Base:

#/models/not_legacy/base.rb

require 'active_record'
require 'erb'

module NotLegacy
  class Base < ActiveRecord::Base
    self.abstract_class = true

    conf_contents = File.read('config/pg.yml')
    conf_evaluated = ::ERB.new(conf_contents).result
    conf = YAML.load(conf_evaluated)

    ActiveRecord::Base.establish_connection conf['not_legacy']
  end
end

Кроме того, у меня есть два класса, которые наследуются от ранее описанных классов.Это Legacy :: Company:

#/models/legacy/company.rb    

require_relative 'base'

module Legacy
  class Company < Base
    self.table_name = "company"
  end
end

и NotLegacy :: Company:

#/models/not_legacy/company.rb    

require_relative 'base'

module NotLegacy
  class Company < Base
    self.table_name = "company"
  end
end

Теперь, если я иду к консоли и делаю что-то вроде (я печатаю значение conf):

irb(main):001:0> load 'app/models/legacy/company.rb'
CONFS: {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "host"=>"localhost", "user"=>"xxxxx", "password"=>"xxxxx", "database"=>"legacy"}
=> true
irb(main):002:0> Legacy::Company.count
=> 8
irb(main):003:0> load 'app/models/not_legacy/company.rb'
CONFS: {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "host"=>"localhost", "user"=>"xxxxx", "password"=>"xxxxx", "database"=>"not_legacy"}
=> true
irb(main):004:0> NotLegacy::Company.count
=> 1

На данный момент, похоже, все работает правильно, поскольку в базе данных legacy имеется 8 записей для компании и в not_legacy база данных есть только 1 запись .Но если я снова вызываю Legacy :: Company, я получаю:

irb(main):005:0> Legacy::Company.count
=> 1
irb(main):005:0> NotLegacy::Company.count
=> 1

Похоже, что второе соединение (с базой данных not_legacy) перезаписывает первое (сделанноев устаревшую базу данных).

Если кто-нибудь из вас сможет объяснить мне, почему это происходит и как это исправить, я буду безмерно благодарен

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

в config / database.yml

other_base:
  adapter: postgresql
  encoding: unicode
  pool: 5
  host: localhost
  user: xxxxx
  password: xxxxx

в вашей модели

class YourModel < ActiveRecord::Base
   self.establish_connection :other_base
end
0 голосов
/ 11 февраля 2019

Сначала я хотел бы рассказать о том, как вы проходите поток кода,

Когда вы загружаете любой класс, его код выполняется и методы определяются, ваше соединение создается с помощью статического кода, написанного & *Выполнено 1003 *.

Одно приложение rails может иметь соединение с одной базой данных

Вам лучше написать код для переключения между разными базами данных, чтобы иметь доступ к другой базе данныхсвязность.

Legacy::Company или NotLegacy::Company обе модели имеют одно и то же имя таблицы companies из разных баз данных.Но при подключении конкретной базы данных обе модели (которые были загружены) будут указывать на таблицу companies в текущей базе данных.

So what is current database mean to both model ? -> Той, которая в последний раз загружалась establish_connection.

Так что это немного утомительно, но работает, что если вы работаете с разными базами данных, вам придется продолжать переключаться с одной базы данных на другую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...