/ / Compilare una raccolta di record attiva con SQL diversi sullo stesso modello in rotaie - ruby-on-rails

Compilare una raccolta record attiva con SQL diversi sullo stesso modello in rotaie - ruby-on-rails

Sto cercando di compilare una raccolta di record attiva da più SQL sullo stesso modello.L'unica cosa che differisce tra gli SQL è la clausola where.I miei modelli hanno un id_tipo.

models = Model.where("type_id = ?", 1)
logger.debug "models.count " + models.count.to_s
m = Model.where("type_id = ?", 2)
models << m
logger.debug "models.count " + models.count.to_s

Da quello, il mio file di registro mi mostra

SELECT COUNT(*) FROM "models"  WHERE (type_id = 1)
models.count 1
SELECT COUNT(*) FROM "models"  WHERE (type_id = 1)
models.count 1

Il secondo SQL non è corretto per la mia situazione, volevo

SELECT COUNT(*) FROM "models"  WHERE (type_id = 2)

L'unico modo che ho trovato per aggirare questo è quello di fare Model.all, scorrere su ciascuno e aggiungere quelli che voglio. Ciò richiederebbe molto tempo per un modello di grandi dimensioni. Esiste un modo migliore?

risposte:

1 per risposta № 1

Dai suoni di ciò che stai cercando Model con un type_id di 1 o 2. In SQL, dovresti esprimere questo come una proposizione secondaria IN:

SELECT * FROM models WHERE type_id IN (1, 2);

In Rails, è possibile passare una matrice di valori accettabili a a where chiama per generare l'istruzione SQL IN:

Model.where(:type_id => [1, 2])

1 per risposta № 2

Come indicato da @ArtOfCode, ciò che si desidera è eseguire la query su un solo passaggio. Detto questo, quello che stai cercando di fare non vince, perché quando stai aggiungendo << l'oggetto della seconda query al primo si sta appena aggiungendo l'istanza alla prima raccolta. Il tipo di oggetto della query risultante è un ActiveRecord_Relation che capita di contenere due istanze dei modelli personalizzati (in questo caso Model) ma quando si invia / chiama count questo è in realtà l'esecuzione di un ActiveRecord query.

Come puoi capire la differenza? Bene, se esegui quel codice che hai usato e fatto:

models.count

Vedrai che l'SQL viene eseguito per tutte le condizioni della query models hai fatto, tuttavia, se lo fai:

models.length

Noterai che il risultato è 2e il motivo è perché la lunghezza della collezione dei tuoi oggetti che si trova all'interno del ActiveRecord_Relation è davvero due, ed è quello che succede se usi <<; aggiungerà istanze di oggetti alla relazione ma ciò non significa che facciano parte della query.

Potresti anche fare questo:

models << Model.new

E chiamando models.length restituirebbe effettivamente 3 perché quello è ilquantità di istanze del modello contenute nella relazione, ancora una volta, non una parte della query. Quindi, come puoi vedere, puoi perfino aggiungere nuove istanze di oggetti che non sono nemmeno state salvate nel database.

TL; DR se vuoi interrogare oggetti che sono memorizzati nel database, fallo sulla stessa query, o concatena le condizioni in una sola volta, ma non provare a mescolare le raccolte di relazioni activerecord.