ActiveRecord 3.1.0 несколько баз данных - PullRequest
9 голосов
/ 12 сентября 2011

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

Для каждой из наших баз данных мы указываем отдельный базовый класс, который наследуется от ActiveRecord::Base, и вызываем там establish_connection. Нет никаких связей между базами данных. До сих пор это работало хорошо для нас.

После обновления до ActiveRecord 3.1.0, я вижу, что происходит сбой с исключением ActiveRecord::ConnectionNotEstablished при обходе отношений (т. Е. Он успешно извлекает один объект или их набор из БД, но не удается при переходе к родственный класс).

Верхняя строка следа - C:/Ruby/lib/ruby/gems/1.9.1/gems/activerecord-3.1.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in 'retrieve_connection', поэтому я немного углубился в это. Метод определяется следующим образом:

def retrieve_connection(klass) #:nodoc:
    pool = retrieve_connection_pool(klass)
    (pool && pool.connection) or raise ConnectionNotEstablished
end

Мой простой тест (puts Customer.first.address) вызывает retrieve_connection 3 раза. Дважды с Customer в качестве параметра klass и один раз с ActiveRecord::Base в качестве параметра - когда происходит сбой, так как establish_connection не был вызван для ActiveRecord::Base.

К актуальному вопросу тогда - есть ли новый рекомендуемый способ обработки нескольких соединений с базой данных в ActiveRecord? Если так, что это?

Если нет, то что может быть причиной этой проблемы?

Ответы [ 2 ]

9 голосов
/ 13 сентября 2011

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

Похоже, теперь необходимо установить соединение на ActiveRecord :: Base, чтобы он мог определить длины / правила имен таблиц адаптера. Наряду с остальными моими соединениями, установленными в инициализаторе базы данных, теперь у меня также установлено соединение ActiveRecord :: Base с одной из моих БД (не важно, какая из них).

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

3 голосов
/ 28 ноября 2011

Я использую это решение - то, что я видел, было то, что, когда в каждом из классов OtherDb вызывался установочный_коннекцион - казалось, что было много перегрузок определений таблицы перезагрузки, и я каждый раз видел проблемы случайно при каждой перезагрузке класса def.

# The idea here is to specify that a given model should use another
# database without having to change the entire inheritance hierarchy

# declare model for table in primary connection
class Bar < ActiveRecord::Base
  # assume we have logic here that we don't want to refactor into a module
  # but we do want to inherit in OtherDb::Bar
end

module Foo

  # base model in Foo namespace - uses another db
  class BaseConnection < ActiveRecord::Base
    # OtherDb::Title.database contains a db config hash
    # This would probably go in the initializers
    establish_connection OtherDb::Title.database 
  end

  # module used to override db connection
  module OtherDb::Base
    def retrieve_connection
      # connection_handler.retrieve_connection(self) #  normal behavior
      connection_handler.retrieve_connection(Foo::BaseConnection) # use db from Foo::BaseConnection
    end
  end

  # Foo::Bar is identical to ::Bar but is in another db
  class Bar < ::Bar
    extend OtherDb::Base
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...