2012-02-04 23 views
6

tôi đã thực hiện thí điểm Associaton đa hình trong Mongoidlàm thế nào để loại bỏ các thuộc tính từ một mô hình Mongoid, tức là không chỉ vô hiệu hóa các giá trị của họ

class Group 
    include Mongoid::Document 
    belongs_to :groupable, polymorphic: true 
end 

class Album 
    include Mongoid::Document 
    has_many :groups, as: groupable 
end 

sau đó tôi đã quyết định chống lại nó. Vì vậy, tôi đã xóa tất cả những thuộc tính đó thuộc về_loại và has_many ở trên. Tuy nhiên, trong giao diện điều khiển, bất cứ khi nào tôi nhận được một bản ghi Nhóm mà tôi đã thử nghiệm, nó vẫn có thuộc tính "groupable_type" này. Tôi biết remove_attribute vô hiệu hóa thuộc tính, nhưng không loại bỏ nó (âm thanh giống như JavaScript). Làm thế nào tôi có thể thực sự loại bỏ thuộc tính này từ cơ sở dữ liệu từ Mongoid?

Trả lời

13

Bạn có thể làm điều này:

Group.collection.update({}, 
         {'$unset' => {:groupable_type => 1}}, 
         :multi => true) 
+0

Tôi đã nhìn thấy một cái gì đó về "bỏ đặt" sau khi googling, đã không nhận ra nó là một cái gì đó từ giao diện điều khiển mongo. - theo ý kiến ​​của bạn, không phải là một chút cồng kềnh để loại bỏ một lĩnh vực? cảm ơn! –

+5

Nó không phải là "từ mongo console", nó là một nhà điều hành mongodb hạng nhất. Mongoid có thể có một phương pháp trợ giúp cho điều này, nhưng không có gì xấu trong việc lái xe cơ bản. Ngoài ra, bạn luôn có thể tự viết helper đó. :) –

+0

oops .. ooops .. ooops .. bất cứ khi nào tôi nhìn thấy $ điều, một số lý do, tôi nghĩ về giao diện điều khiển .. Xin lỗi về điều đó. Và tôi không thể đồng ý nhiều hơn, có những toán tử hạng nặng cơ bản như vậy là một lý do chính khiến tôi chuyển sang MongoDB/Mongoid (và cũng vì vậy mà tôi không phải "di chuyển" bất cứ thứ gì nữa: D). Đợi thêm 3 phút nữa để kiểm tra "đã trả lời" –

0

tôi nhận thấy trong Moped 2.0.0.rc1 phương pháp cập nhật đã biến mất trên bộ sưu tập, nhưng hoạt động này;

Group.collection.find().update(
        {'$unset' => {:groupable_type => 1}}, 
        :multi => true)  
2

Kể từ phiên bản 5.0.0 của Mongoid, đá quý đã chuyển từ sử dụng Xe máy sang sử dụng 'trình điều khiển Ruby chính thức MongoDB' có cú pháp cập nhật khác. Tham khảo: https://docs.mongodb.org/ecosystem/drivers/ruby/

Các tài liệu cho phương pháp thu thập là ở đây: http://api.mongodb.org/ruby/current/Mongo/Collection.html

Có 2 phương pháp, "cập nhật" và "update_many". Bạn có thể sử dụng update_many thay vì chỉ định tùy chọn 'đa' để cập nhật tất cả tài liệu.

Ví dụ sử dụng cho các Ops trường hợp:

Group.collection.update_many({}, {'$unset' => {'groupable_type' => true}}) 

Lưu ý bạn có thể bỏ đặt văn bản nhúng sử dụng ký hiệu dấu chấm:

Group.collection.update_many({}, {'$unset' => {'embedded_doc.groupable_type' => true}}) 

Lưu ý nó không phải là cũng được hỗ trợ bởi MongoDB để unset lĩnh vực/cập nhật trong vòng một mảng. Xem chủ đề này để biết thông tin và giải pháp: https://jira.mongodb.org/browse/SERVER-1243.

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