2011-09-09 28 views
6

Mongoid :: Paranoia thêm một phạm vi mặc định với mô hình mà tạo ra các tiêu chuẩnray mongoid tiêu chí rõ ràng

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

tôi có thể tìm thấy xóa tài liệu với Model.deleted mà tạo ra,

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

thế nào có thể tôi ghi đè lên điều này để tôi có thể tìm kiếm cả hai tài liệu đã bị xóa và không bị xóa.

PS Model.unscoped không hoạt động

+3

không được tích hợp hiện đang hoạt động. – edbond

Trả lời

5

Hãy thử điều này (loại hình này hack):

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

cảm ơn, điều này được thực hiện công việc – Dipil

0

Hãy thử điều này

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

Model.all_objects 

UPD

lĩnh vực deleted_at là một lĩnh vực datetime, giống như các lĩnh vực created_at mặc định chèn bởi timestamps mongoid, vì vậy nó ném một ngoại lệ khi được kiểm tra cho delete_at trong [true, false] là boolean

def self.all_objects 
    where(:deleted_at=>{"$exists"=>false}).and(:deleted_at=>{"$exists"=>true}) 
end 
+0

trường deleted_at là trường datetime, như trường created_at mặc định được chèn bởi dấu thời gian mongoid, do đó, nó ném một ngoại lệ khi được chọn cho deleted_at trong [true, false] là boolean. – Dipil

+0

nhận được nó, tôi sẽ cập nhật câu trả lời của tôi ngay bây giờ – fl00r

+0

@ fl00r Nó sẽ không hoàn thành công việc, các tiêu chí sau sẽ ghi đè các tiêu chí trước đó. Nó giống như thiết lập 'hash [: deleted_at] = {" $ exist "=> false}; hash [: deleted_at] = {"$ exist" => true} ' – rubish

2

tôi đã thực hiện để sử dụng:

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

nhưng self.unscoped dường như làm việc quá.

+0

Model.unscoped.selector hoạt động tuyệt vời cho một lần – loopj

0

Nếu ai đó đang tìm kiếm một cách để loại bỏ một trong những phạm vi từ tiêu chí mà bạn có thể làm điều đó như thế này:

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

Bạn có thể tiêu chí chuỗi truy vấn sau đó để nó thực sự hữu ích.