2015-10-07 11 views
6

mongoid 4.0.2モンゴイドデフォルトスコープはデフォルト値をオーバーライドします。どうして?

私はTestクラスを持っている:

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

    field :successful,  type: Boolean, default: false 

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

その後、私は:何がこの振る舞いの背後にある理由です:

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

だからここに質問はありますか?

P.S.after_initializeメソッドの助けを借りてsuccessfulをリセットして固定しました。

+0

これはバグのようです。あなたがこれを引き起こしている 'default_scope'であることを確認しましたか? – Drenmi

+0

@Drenmi default_scopeで行を削除すると、すべてが大丈夫です。だから私はそう思います。 –

+0

@muistooshortもちろん、今修正されました。 –

答えて

1

Test.create()を呼び出すと、正常に実行されます。これは奇妙に思えますが、あなたのdefault_scopeであなたが言っていることを考えてみてください...本当のすべてのテストを取得してください。しかし、それはない、rails3 default_scope, and default column value in migrationこれは動作するはずactive_recordそれは厳密に従っているが:モンゴの世界では

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

、あなたはdefault_scopeそれに置けば

は、これはもともとactive_recordから来た何かのように見えますそれを使ってすべてのオブジェクトをスコープし、新しいものにも同じデフォルトを持たせることを望むと仮定します。回避策はコールバックを使用しています。あなたは良い選択であるafter_initializeを接続すると述べましたが、実際に設定されているかどうかを確認する必要があります。別の方法として、デフォルトではなく名前付きスコープを使用する方法があります。