Rails 3 - несколько баз данных с условием соединений - PullRequest
13 голосов
/ 01 ноября 2011

Моя среда: Ruby 1.9.2p290, Rails 3.0.9 и RubyGem 1.8.8

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

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

class Visit < ActiveRecord::Base
  self.establish_connection "lab"
  belongs_to :patient
end

class Patient < ActiveRecord::Base
  self.establish_connection "main"
  has_many :visits
end

Я получил ошибку, когда встречаю следующий сценарий

@visits = Visit.joins(:patient)

Ошибки: Mysql2 :: Ошибка: Таблица 'lab.patients' не делает 't существует: SELECT visits. * FROM visits INNER JOIN patients ON patients. id IS NULL

Здесь таблица «пациентов» находится в «основной» базе данных и таблице «посещений»в базе данных «лаборатории» я сомневаюсь, что при выполнении кода Rails рассматривает таблицу «пациентов» как часть базы данных «лаборатории» [которая содержит таблицу «посещений»].

Ответы [ 5 ]

10 голосов
/ 22 ноября 2011

Ну, я не знаю, является ли это наиболее элегантным решением, но я заставил это работать, определив self.table_name_prefix для явного возврата имени базы данных.

class Visit < ActiveRecord::Base
  def self.table_name_prefix
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV']
    (renv.empty? ? "lab." : "lab_#{renv}.")
  end

  self.establish_connection "lab"
  belongs_to :patient
end

class Patient < ActiveRecord::Base
  def self.table_name_prefix
    renv = ENV['RAILS_ENV'] || ENV['RACK_ENV']
    (renv.empty? ? "main." : "main_#{renv}.")
  end

  self.establish_connection "main"
  has_many :visits
end

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

7 голосов
/ 27 апреля 2012

Может быть чище сделать что-то вроде этого:

  def self.table_name_prefix
    "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."
  end

Это извлечет соответствующее имя базы данных из вашего файла database.yml

3 голосов
/ 19 ноября 2012

Или даже

def self.table_name_prefix
   self.connection.current_database+'.'
end
2 голосов
/ 01 ноября 2011

Ваша вторая база данных на другом компьютере?Вы всегда можете сделать, как предложено в этом другом вопросе:

MySQL - объединение баз данных на разных серверах с использованием Python?

0 голосов
/ 22 марта 2013

Я бы использовал self.table_name_prefix, как предложили другие, но вы можете определить его немного более четко, как это:

self.table_name_prefix "#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."

в качестве альтернативы вы также можете использовать это:

self.table_name_prefix "#{connection.current_database}."

Вы должны иметь в виду, что последний выполнит запрос SELECT DATABASE() as db при первой загрузке класса.

...