2015-10-07 29 views
6

mongoid 4.0.2L'ambito predefinito mutoide sostituisce il valore predefinito. Perché?

Ho Test classe:

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

    field :successful,  type: Boolean, default: false 

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

poi faccio:

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

Quindi, ecco la domanda: qual è il motivo alla base di questo comportamento?

P.S. L'ho risolto ripristinando successful con l'aiuto del metodo after_initialize.

+0

Sembra un bug. Hai confermato che è il 'default_scope' a causare questo? – Drenmi

+0

@Drenmi Quando rimuovo la riga con default_scope tutto è ok, quindi credo che sì. –

+0

@muistooshort t ovviamente, risolto ora, il mio male. –

risposta

1

Provare a chiamare Test.create(), anche il successo sarà vero. Questo sembra strano, ma pensa quello che stai dicendo nel tuo default_scope ... ottieni tutti i test che sono vere.

questo appare come qualcosa che è venuto da active_record origine: rails3 default_scope, and default column value in migration tuttavia è rigorosamente rispettata active_record questo dovrebbe funzionare, ma non è così:

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

Nel mondo mongo, se si mette su un default_scope esso sistemeremo tutti gli oggetti con questo e supponiamo che vorresti che anche qualsiasi cosa di nuovo abbia lo stesso valore predefinito. I work around utilizzano i callback. Hai menzionato l'hooking after_initialize che è una buona scelta, tuttavia devi assicurarti di controllare se è stato effettivamente impostato. Un'altra alternativa sarebbe utilizzare un ambito con nome piuttosto che il valore predefinito.