2013-07-29 13 views
5

ich eine Halterung für das Modell "Software-Version" habe:Rails, Ansetzungen und default_scope

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

Und einen Standardbereich für das Modell:

default_scope where(is_testing: false) 

Wenn ich das in einem Test:

software_versions(:testing) 

ich erhalte eine Fehlermeldung:

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

Ist das beabsichtigte Verhalten? Und wie überschreibe ich es?

+0

Nun in der Leuchte yo angeben, dass is_testing wahr ist und der Standardbereich des Modells ist: is_testing: false so wie kann der Datensatz gefunden werden? –

Antwort

3

Ja, dies ist ein beabsichtigtes Verhalten, der Standardbereich betrifft alle Abfragen. Verwenden Sie unscoped eine saubere Abfrage erneut zu starten:

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

Aber das auseinander, wenn Sie die gleiche Tabelle verwenden (mit Befestigungen) zum Speichern von Produktion und Aufzeichnungen testen, dann tust du es falsch. Rails verwendet eine völlig andere Datenbank zum Testen, so dass Sie keine Spalte zur Unterscheidung benötigen. Und wenn Sie die Fixtures unter test/fixtures setzen, werden sie nie in die Produktion geladen.

+0

Oh - das Feld is_testing wird verwendet, um zu bestimmen, ob die Softwareversion eine Testversion nur für Testeinheiten (Computer) ist oder ob sie für den produktiven Einsatz bereit ist :-) Die Terminologie stammt aus einer tatsächlichen Produktionsanwendung. – jriff

+0

Aha - danke für die Klarstellung, aber das war nur eine Nebenbemerkung. Antwortet 'unscoped' jedoch auf Ihre Frage? – Subhas

+0

Es tut und tut es nicht. Ich wusste, dass ich ungeschnittenes Material verwenden konnte, um den Rekord zu bekommen. Was ich wollte, war in der Lage, die shorthand software_versionen (: testen) zu verwenden. Um den Code sauber und ordentlich zu halten. Aber ich denke, dass dies der einzige Weg ist, dies zu tun - ja. Vielen Dank. – jriff

2

Das Verhalten ist wie vorgesehen, das einzige Problem ist, dass in Ihrer Testdatenbank keine Aufzeichnung der Softwareversion vorhanden ist. Sie müssen nur die Datenbank auffüllen, bevor Sie die Tests ausführen. Wie Sie sehen können, ist die Abfrage perfekt durchgeführt, WHERE software_versions.is_testing = 0, mit Null bedeutet false wie in Ihrem default_scope.

+0

Ich stimme zu, dass es offensichtlich ist, was vor sich geht. Es ist jedoch sehr schwierig, das Gerät zu verwenden, wenn es nicht referenziert werden kann. Man muss in der Lage sein, die Vorrichtung uncoped zu bekommen ... – jriff

+0

Hmm, ich sehe. Die Sache ist die '.where' Methode fragt die Datenbank in dem Moment ab, in dem sie aufgerufen wird. Vielleicht sollten Sie einen anderen Ansatz ausprobieren, indem Sie ein neues Objekt mit '.new' erstellen und die Attribute als Parameter oder was auch immer übergeben. – MurifoX