2011-09-09 5 views
6

Mongoid明確な基準をmongoid ::妄想は私が生成Model.deletedで削除された文書を見つけることができ基準レールは

#<Mongoid::Criteria 
    selector: {:deleted_at=>{"$exists"=>false}}, 
    options: {}, 
    class: Line, 
    embedded: false> 

を生成し、モデルにデフォルトのスコープを追加し、

#<Mongoid::Criteria 
    selector: {:deleted_at=>{"$exists"=>true}}, 
    options: {}, 
    class: Line, 
    embedded: false> 

どのようにすることができます私はこれを無効にするので、私は削除された文書と削除されていない文書の両方を検索できます。

+3

unscopedは現在動作しています。 – edbond

答えて

5

(ハックのその種)、これを試してみてください:

class User 
    include Mongoid::Document 
    include Mongoid::Paranoia 

    def self.ignore_paranoia 
    all.tap {|criteria| criteria.selector.delete(:deleted_at)} 
    end 
end 

# ignore paranoia is defined on model, so can't chain it to criteria or scopes 
# but it returns criteria, so can chain other scope and criteria to it 
User.ignore_paranoia.some_scope.where(:whatever => "my_custom_value") 
+0

これは仕事が終わったことを意味します – Dipil

0

動作しない

PS Model.unscopedので、deleted_atフィールドはmongoidタイムスタンプによって挿入されたデフォルトのcreated_atフィールドのように、日時フィールドで、この

def self.all_objects 
    where(:deleted_at.in => [false, true]) 
end 

Model.all_objects 

UPD

をお試しくださいブール値

である[true、false]でdeleted_atがチェックされたときに例外がスローされます
def self.all_objects 
    where(:deleted_at=>{"$exists"=>false}).and(:deleted_at=>{"$exists"=>true}) 
end 
+0

deleted_atフィールドはmongoidタイムスタンプによって挿入されるデフォルトのcreated_atフィールドのようなdatetimeフィールドなので、[true、false]のbooleanでdeleted_atをチェックすると例外がスローされます。 – Dipil

+0

それを持って、私は今私の答えを更新する – fl00r

+0

@ fl00rそれは仕事を完了するつもりはない、後の基準は、以前の基準をオーバーライドします。これは 'hash [:deleted_at] = {" $ exists "=> false}を設定するようなものです。 – rubish

2

私が使用して撮影した:

def self.all! 
    Mongoid::Criteria.new self 
end 

あまりにも動作するようにself.unscopedようです。

+0

Model.unscoped.selectorはワンオフに最適です – loopj

0

誰かがあなたはこのようにそれを行うことができます基準からスコープのいずれかを削除する方法を探している場合:

query = Item.published.before(DateTime.now).unblocked 
query.remove_scoping(Item.before(DateTime.now)) 

それは本当に便利ですので、あなたがチェーン基準はその後照会することができます。