Źródła:Rails 3 dodając nazwę bazy danych do tabeli sprawia, że zawiera domyślne dla chętnych obciążenia
- http://emphaticsolutions.com/2009/11/23/has_many_through_across_databases.html
- http://blog.arkency.com/2013/12/rails4-preloading/
Mój projekt jest w kierunku posiadania wielu baz danych (obecnie na tym samym serwerze) , i chciałbym móc dołączyć między tymi bazami danych. Aby to zrobić, należy dodać nazwę bazy danych, aby prefiks tabeli tak:
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
Dodanie nazwy tabeli przedrostek wydaje się wpływać na zachowanie domyślne zawiera tego samego zapytania, nawet w obrębie tej samej bazy danych . Rozważmy User.includes(:user_roles).first
bez nazwy tabeli przedrostek:
obciążenia użytkownika (67.1ms) SELECT * FROM
t_users
t_users
LIMIT 1 UserRole obciążenie (84.5ms) SELECT * FROMt_user_roles
t_user_roles
GDZIEt_user_roles
...user_id
NA (1)
Z Nazwa tabeli początkowy:
SQL (76.8ms) select distinct
DBNAME
.t_users
.id FROMDBNAME
.t_users
LEFT OUTER DOŁĄCZ DODBNAME
.t_user_roles
ONDBNAME
.t_user_roles
.user_id
=DBNAME
.t_users
.id
LIMIT 1SQL (66.4ms) WYBIERZ
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 ODDBNAME
.t_users
LEFT OUTER DOŁĄCZ DODBNAME
.t_user_roles
ONDBNAME
.t_user_roles
.user_id
=DBNAME
.t_users
.id
WHEREDBNAME
.t_users
.id
IN (1)
Innymi słowy, domyślne zachowanie wywołań zostało zmienione z preload na chętne ładowanie.
Czy ktoś wie, dlaczego zmienia się domyślne zachowanie? Musi być coś na temat dodawania nazwy bazy danych, która sprawia, że Railsy są zmuszone do ładowania, ale nie rozumiem dlaczego. Jestem także zaskoczony tym, ponieważ wyobrażam sobie, że nie jest niczym niezwykłym dodanie nazwy bazy danych w. Mogę brutalnie wymuszać naprawę tego w naszej bazie kodu, zmieniając wszystkie załączniki, aby wstępnie załadować, ale chciałbym zrozumieć, co się tutaj dzieje. Czy istnieje sposób na zmianę domyślnego zachowania?
Czy "FirstBase" jest klasą abstrakcyjną? ('self.abstract_class = true'). Domyślam się, że logika STI może zakłócać generowanie sql tutaj. Może spróbuj wyodrębnić tę logikę w module/zagadnieniu? (zwróć też uwagę, że modele z określonymi nazwami używają 'table_name_prefix 'swojego modułu nadrzędnego). Z drugiej strony, AFAIK faktyczny SQL wygenerowany przez 'includes' jest" niezdefiniowanym zachowaniem "i zależy od twojego adaptera DB. –