Fonti:Rails 3 aggiungendo il nome del database di tabella non sia include di default a carico desiderosi
- http://emphaticsolutions.com/2009/11/23/has_many_through_across_databases.html
- http://blog.arkency.com/2013/12/rails4-preloading/
Il mio progetto si sta muovendo verso avere più database (attualmente sullo stesso server) e vorrei poter unire tra questi database. Per fare questo, ho bisogno di aggiungere il nome del database per il prefisso delle tabelle in questo modo:
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
aggiungendo il prefisso nome della tabella sembra influenzare il comportamento predefinito include sulla stessa query, anche all'interno dello stesso database . Considerare User.includes(:user_roles).first
Senza nome della tabella prefisso:
User Load (67.1ms) SELECT * FROM
t_users
t_users
LIMIT 1 UserRole carico (84.5ms) SELECT * FROMt_user_roles
t_user_roles
DOVEt_user_roles
...user_id
IN (1)
Con il nome della tabella prefisso:
SQL (76.8ms) SELECT DISTINCT
DBNAME
.t_users
.id DADBNAME
.t_users
LEFT OUTER JOINDBNAME
.t_user_roles
SUDBNAME
.t_user_roles
.user_id
=DBNAME
.t_users
.id
LIMIT 1SQL (66,4 ms) SELEZIONARE
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 DALDBNAME
.t_users
LEFT OUTER JOINDBNAME
.t_user_roles
SUDBNAME
.t_user_roles
.user_id
=DBNAME
.t_users
.id
DOVEDBNAME
.t_users
.id
IN (1)
In altre parole, il comportamento predefinito delle chiamate include è cambiato da pre-caricamento a carico bisognoso.
Qualcuno sa perché il comportamento predefinito sta cambiando? Ci deve essere qualcosa nell'aggiungere il nome del database che fa pensare a Rails che dobbiamo caricarci con rabbia, ma non vedo perché. Sono anche sorpreso di vedere questo come immagino non sia insolito aggiungere il nome del database. Posso forzare bruto-forzare questo nella nostra base di codice cambiando tutto include al precaricamento, ma mi piacerebbe capire cosa sta succedendo qui. C'è un modo per cambiare il comportamento predefinito?
'FirstBase' è una classe astratta? ('self.abstract_class = true'). La mia ipotesi è che la logica STI possa interferire con la generazione SQL qui. Forse provi ad estrarre questa logica in un modulo/preoccupazione? (Si noti inoltre che i modelli con namespace usano il parametro table_name_prefix del loro modulo genitore). D'altra parte, AFAIK l'effettivo SQL generato da 'includes' è" comportamento indefinito "e dipende dall'adattatore DB. –