2015-10-07 18 views
6

mongoid 4.0.2Mongoid mặc định phạm vi ghi đè giá trị mặc định. Tại sao?

Tôi có Test lớp:

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

    field :successful,  type: Boolean, default: false 

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

Sau đó, tôi làm:

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

Vì vậy, đây là câu hỏi: lý do đằng sau hành vi này là gì?

P.S. Tôi đã sửa nó đặt lại successful với sự trợ giúp của phương pháp after_initialize.

+0

Điều này nghe giống như một lỗi. Bạn đã xác nhận nó là 'default_scope' đang gây ra điều này? – Drenmi

+0

@Drenmi Khi tôi loại bỏ dòng với default_scope tất cả mọi thứ là ok, vì vậy tôi đoán yeah. –

+0

@muistooshort t tất nhiên, cố định ngay bây giờ, xấu của tôi. –

Trả lời

1

Hãy thử gọi Test.create(), thành công cũng sẽ đúng. Điều này có vẻ lạ, nhưng hãy nghĩ những gì bạn đang nói trong default_scope của bạn ... nhận được tất cả các bài kiểm tra đó là sự thật.

này trông giống như một cái gì đó đến từ active_record ban đầu: rails3 default_scope, and default column value in migration tuy nhiên nó được tuân thủ nghiêm ngặt active_record này nên làm việc, tuy nhiên nó không:

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

Trong thế giới Mông Cổ, nếu bạn đặt trên một default_scope nó sẽ phạm vi tất cả các đối tượng với điều đó và giả định rằng bạn sẽ muốn bất cứ điều gì mới cũng có cùng một mặc định. Công việc xung quanh đang sử dụng callbacks. Bạn đã đề cập hooking lên after_initialize là một lựa chọn tốt, tuy nhiên bạn cần phải chắc chắn rằng bạn kiểm tra xem nó đã thực sự được thiết lập chưa. Một lựa chọn khác là sử dụng một phạm vi được đặt tên chứ không phải là mặc định.

Các vấn đề liên quan