2015-10-07 12 views
6

mongoid 4.0.2Der Mongoid-Standardbereich überschreibt den Standardwert. Warum?

Ich habe Test Klasse:

class Test 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Mongoid::Paranoia 

    field :successful,  type: Boolean, default: false 

    default_scope ->{ where(successful: true) } 
end 

Dann mache ich:

t=Test.new; t.successful 
=> true 

So, hier ist die Frage: , was ist der Grund für dieses Verhalten?

P.S. Ich habe es behoben successful mit Hilfe von after_initialize Methode.

+0

Das klingt wie ein Fehler. Haben Sie bestätigt, dass dies das 'default_scope' ist? – Drenmi

+0

@Drenmi Wenn ich Zeile mit default_scope entfernen, ist alles in Ordnung, also denke ich ja. –

+0

@muistooshort t natürlich, jetzt behoben, mein schlechtes. –

Antwort

1

Versuchen Sie Aufruf von Test.create(), wird auch erfolgreich sein. Dies scheint seltsam, aber denken Sie, was Sie in Ihrem default_scope sagen ... erhalten Sie alle Tests, die wahr sind.

Das sieht aus wie etwas, das ursprünglich aus active_record kam: rails3 default_scope, and default column value in migration aber es streng active_record dies funktionieren sollten befolgt wird, ist es jedoch nicht:

t= Test.unscoped.new; t.successful 
=> true 

In der Mongo Welt, wenn Sie auf einem default_scope setzen es Ich werde alle Objekte damit in Verbindung bringen und annehmen, dass Sie möchten, dass etwas Neues denselben Standard hat. Die Workarounds verwenden Rückrufe. Sie haben erwähnt, dass Sie das after_initialize anschließen, was eine gute Wahl ist, aber Sie müssen sicherstellen, dass Sie überprüfen, ob es tatsächlich gesetzt wurde. Eine andere Alternative wäre die Verwendung eines benannten Bereichs anstelle des Standardbereichs.

Verwandte Themen