Ho una serie di sottoclassi STI che ereditano da una classe User
base. Sto scoprendo che in determinate condizioni all'interno di una definizione sottoclasse, le query sui sottoclassi non utilizzano correttamente la condizione type
.ActiveRecord: query non utilizza corretta condizione tipo per STI sottoclasse
class User < ActiveRecord::Base
# ...
end
class Admin < User
Rails.logger.info "#{name}: #{all.to_sql}"
# ...
end
Quando si carica la console Rails in fase di sviluppo, si fa quello che ci si aspetterebbe:
Admin: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin')
Ma quando colpisce l'app (localhost/Pow), manca la condizione type
e ottengo questo :
Admin: SELECT `users`.* FROM `users`
Ma non attraverso l'app quando quando distribuito a un server di gestione temporanea:
Admin: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin')
Questo, naturalmente, fa sì che qualsiasi query eseguite qui in app dev (ma non dalla console) per non essere corretto. Nello specifico, sto provando a precaricare una (piccola) cache di valori db esistenti per creare alcuni metodi utili basati su quei dati. Senza lo scope del tipo, la cache è ovviamente errata!
Dalla stessa posizione (Admin
), otteniamo la seguente contraddizione confusione:
[11] pry(Admin)> Admin.finder_needs_type_condition?
=> true
[12] pry(Admin)> Admin.send(:type_condition).to_sql
=> "`users`.`type` IN ('Admin')"
[13] pry(Admin)> Admin.all.to_sql
=> "SELECT `users`.* FROM `users`"
Inoltre, ho definito una sottoclasse usa e getta Q < User
all'interno del file user.rb
. Mi sono collegato Q.all.to_sql
dalla sua definizione, dalla definizione di Admin
, e da una vista. In questo modo, si ottiene:
From Q: Q: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Q')
From Admin: Q: SELECT `users`.* FROM `users`
From View: Q: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Q')
Che cosa potrebbe causare, nella prima riga della definizione Admin
sottoclasse in admin.rb, qualsiasi sottoclasse di User
non riuscire a utilizzare il suo type_condition
?
questo sta causando prove di sviluppo di fallire, e così è di una certa importanza per la mia app. Cosa diavolo potrebbe causare questa differenza di comportamento? Qualcuno può pensare a un modo più generale intorno al problema di non avere le condizioni STI definite su una sottoclasse durante la sua definizione solo nell'ambiente di sviluppo app?
Grazie per i suggerimenti. Ottengo la differenza di carico impaziente, ma è ancora misterioso perché il problema è * non * presente nella console di sviluppo ma * è * presente nell'app dev (quando utilizzo localhost/pow). Il metodo 'finder_needs_type_condition?' È utile sapere: tuttavia restituisce 'true' quando faccio leva dall'app mentre ancora mi dà' 'SELECT' users'. * FROM 'users'" 'come nella domanda. Correttamente, ho trovato il metodo privato 'type_condition', che, quando chiama' to_sql' on, restituisce '' "' users' .type' IN ('Admin') "' '. Quindi qualcosa è chiaramente rotto. –
Correlati, non ero ** in grado di replicare questo comportamento su un'altra sottoclasse STI di una classe base completamente diversa, quindi questo sembra avere qualcosa a che fare con la classe 'User' in particolare. Avanzamento ... –
Un altro aggiornamento: ho commentato * tutto * nella mia classe di base 'Utente' diversa dalla dichiarazione di classe stessa, e il problema persiste. Quindi non riesco a vedere cosa potrebbe essere speciale in questa classe ora, o come qualunque cosa stia causando questo problema scompare al termine della definizione della classe. –