2013-07-29 15 views
5

ho un appuntamento fisso per il modello "Versione software":Rails, infissi e default_scope

testing: 
    id: 4 
    version: "4.0" 
    file_name: MyString4 
    is_testing: true 

E un ambito predefinito per il modello:

default_scope where(is_testing: false) 

Se faccio questo in un test:

software_versions(:testing) 

ottengo un errore:

ActiveRecord::RecordNotFound: Couldn't find SoftwareVersion with id=4 [WHERE `software_versions`.`is_testing` = 0] 

È il comportamento previsto? E come lo sovrascrivo?

+0

Bene nel dispositivo si specifica che is_testing è true e l'ambito predefinito del modello è 'is_testing: false', quindi come può essere trovato il record? –

risposta

3

Sì, questo è inteso come comportamento, l'ambito predefinito interesserà tutte le query. Utilizzare senza ambito di ricominciare una query pulita:

SoftwareVersion.unscoped.where(is_testing: true) 
SoftwareVersion.unscoped.find(id: 4) 
etc. 

Ma che a parte, se si sta utilizzando la stessa tabella (con i dispositivi) per la memorizzazione sia di produzione e collaudo record, allora si sta facendo male. Rails utilizza un database completamente diverso per i test, quindi non è necessaria una colonna per distinguere. E se metti gli apparecchi sotto lo test/fixtures, non verranno mai caricati in produzione.

+0

Oh - il campo is_testing viene utilizzato per determinare se SoftwareVersion è una versione di prova solo per unità di test (computer) o se sono pronti per l'uso di produzione :-) La terminologia proviene da un'app di produzione effettiva. – jriff

+0

Aha - grazie per il chiarimento, ma quello era solo un sidenote. '' Senza ambito 'risponde alla tua domanda? – Subhas

+0

Lo fa e non lo fa. Sapevo che avrei potuto usare il non-ambito per ottenere il record. Quello che volevo era essere in grado di usare la versione abbreviata software_versions (: testing). Per mantenere il codice pulito e in ordine. Ma immagino che questo sia l'unico modo per farlo - sì. Grazie. – jriff

2

Il comportamento è come previsto, l'unico problema è che nel database di test non è presente alcuna registrazione di SoftwareVersion. Devi solo popolare il database prima di eseguire i test. Come puoi vedere, la query viene eseguita perfettamente, WHERE software_versions.is_testing = 0, con zero significa false come nel tuo default_scope.

+0

Sono d'accordo che è ovvio cosa sta succedendo. Ma è molto difficile usare l'apparecchio quando non può essere referenziato. Uno ha bisogno di essere in grado di ottenere l'apparecchio senza spazio ... – jriff

+0

Hmm, vedo. Il fatto è che il metodo '.where' interroga il database nell'istante in cui viene chiamato. Forse dovresti provare un approccio diverso, creando un nuovo oggetto usando '.new' e passando gli attributi come parametri, o qualsiasi altra cosa. – MurifoX

Problemi correlati