Это «По дизайну». В разрешении перегрузки C ++ для этого типа метода работает следующим образом:
. Поскольку Derived не имеет соответствующей функции с именем« gogo », разрешение перегрузки выходит из строя.
Ну, я не знаю, является ли это самым изящным решением, но мне это удалось, указав, что 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
Я все еще работаю над всеми подробностями, когда дело доходит до определения условий соединения, но я надеюсь, что это поможет.
Может быть, нужно сделать что-то вроде этого:
def self.table_name_prefix
"#{Rails.configuration.database_configuration["#{Rails.env}"]['database']}."
end
Это вытащит соответствующее имя базы данных из вашего файла database.yml
Является ли ваша вторая база данных на другой машине? Вы всегда можете сделать так, как предложено в этом другом вопросе:
MySQL - объединяется между базами данных на разных серверах с помощью Python?
Или даже
def self.table_name_prefix
self.connection.current_database+'.'
end
Я использовал бы 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
при первом загрузке этого класса.