Подтвердить что ты не робот

Rails 3 - множественная база данных с условием объединения

Моя среда: 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" не существует: SELECT visits. * FROM visits INNER JOIN patients ВКЛ patients. id ИМЕЕТ NULL

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

4b9b3361

Ответ 1

Ну, я не знаю, является ли это самым изящным решением, но мне это удалось, определив 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

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

Ответ 2

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

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

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

Ответ 4

Или даже

def self.table_name_prefix
   self.connection.current_database+'.'
end

Ответ 5

Я бы использовал 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 при первом загрузке этого класса.