Источники:
- http://emphaticsolutions.com/2009/11/23/has_many_through_across_databases.html
- http://blog.arkency.com/2013/12/rails4-preloading/
Мой проект движется к созданию нескольких баз данных (в настоящее время на одном сервере), и я хотел бы иметь возможность соединяться между этими базами данных. Для этого мне нужно добавить имя базы данных в префикс таблицы следующим образом:
class FirstBase < ActiveRecord::Base
def self.table_name_prefix
"DBNAME.t_"
end
establish_connection :firstdb
end
class User < FirstBase
has_many :user_roles
end
class UserRole < FirstBase
belongs_to :user
end
Добавление префикса имен таблиц, похоже, влияет на поведение по умолчанию, включенное в один и тот же запрос, даже в пределах одной базы данных. Рассмотрим User.includes(:user_roles).first
Без префикса имени таблицы:
Загрузка пользователя (67.1ms) SELECT
t_users
. * FROMt_users
LIMIT 1 UserRole Load (84.5ms) SELECTt_user_roles
. * FROMt_user_roles
ГДЕt_user_roles
.user_id
IN (1)
С префиксом имени таблицы:
SQL (76.8ms) SELECT DISTINCT
DBNAME
.t_users
.id FROMDBNAME
.t_users
LEFT OUTER JOINDBNAME
.t_user_roles
ВКЛDBNAME
.t_user_roles
.user_id
=DBNAME
.t_users
.id
LIMIT 1SQL (66.4ms) SELECT
DBNAME
.t_users
.id
AS t0_r0,DBNAME
.t_users
.DBNAME
.t_user_roles
.id
AS t1_r0,DBNAME
.t_user_roles
.user_id
AS t1_r1 FROMDBNAME
.t_users
LEFT OUTER JOINDBNAME
.t_user_roles
ВКЛDBNAME
.t_user_roles
.user_id
=DBNAME
.t_users
.id
WHEREDBNAME
.t_users
.id
IN (1)
Другими словами, поведение по умолчанию для входящих вызовов изменилось с предварительной загрузки на загружаемую нагрузку.
Кто-нибудь знает, почему меняется поведение по умолчанию? Должно быть что-то о добавлении имени базы данных, которое заставляет Rails думать, что мы должны загружать загрузку, но я не понимаю, почему. Я также удивлен, увидев это, так как считаю, что добавить имя базы данных не так уж и необычно. Я могу скорректировать это в нашей базе кода, изменив все включенные в preload, но я хотел бы понять, что здесь происходит. Есть ли способ изменить поведение по умолчанию?