2012-03-15 35 views
8

Tôi đọc đến thừa kế trong mongoid và có vẻ như tất cả các lớp được kế thừa sẽ lưu trong lớp cơ sở, ví dụ:Lưu đối tượng được thừa kế vào bộ sưu tập riêng trong Mongoid

class BaseClass 
end 

class ChildClass1 < BaseClass 
end 

class ChildClass2 < BaseClass 
end 

Dường như tất cả các cửa hàng này trong bộ sưu tập BaseClass.

Tôi thực sự muốn chúng lưu trữ trong các bộ sưu tập riêng biệt, ví dụ: ChildClass1 - collectionChildClass2 - collection.

+0

Theo thảo luận về [this] (https://github.com/mongoid/mongoid/issues/1133) vấn đề tôi muốn giả định rằng không có cách nào để lưu trữ các lớp con trong một bộ sưu tập riêng biệt. Bạn có thể đi với mixins thay vì thừa kế như durran gợi ý trong vấn đề này. –

+0

Có vấn đề gì khi sử dụng tính năng này: self.collection_name = "tài khoản" không? Rõ ràng mục tiêu của tôi là giữ cho bộ sưu tập của tôi nhỏ. Đó có phải là một ý tưởng hay không? – Boenne

+0

Tôi tìm thấy câu trả lời hay ở đây http://stackoverflow.com/questions/10704310/mongoid-store-in-produces-random-results – Arugin

Trả lời

3

Không thể làm điều đó. Bởi vì đó là khái niệm về STI Trong Mongoid như explain by Durran the Mongoid creator

Nếu bạn thực sự muốn tiết kiệm trong một số bộ sưu tập bạn cần sử dụng Module bao gồm như:

class BaseClass 
    include MyModule 
end 

class ChildClass1 
    include MyModule 
end 

class ChildClass2 
    include MyModule 
end 
+0

Cảm ơn, đó là đầu vào tốt. Cái này thì sao? self.collection_name = "tài khoản"? có bắt nào không? – Boenne

+1

bạn cần sử dụng phương thức lớp 'store_in' để xác định bộ sưu tập nào bạn muốn lưu đối tượng của mình – shingara

4

Tôi nhận ra điều này đã được đăng cách đây một năm, nhưng điều này có thể là những gì bạn đang tìm kiếm:

class BaseClass 
    include Mongoid::Document 
    def self.inherited(subclass) 
    super 
    subclass.store_in subclass.to_s.tableize 
    end 
end 

class ChildClass1 < BaseClass 
end 

class ChildClass2 < BaseClass 
end 
0

Vui lòng thử phương pháp này:

module Base 
    extend ActiveSupport::Concern 

    include Mongoid::Document 
    include Mongoid::Timestamps 

    included do 
    # Common code goes here. 
    end 
end 

class ChildClass1 
    include Base 
end 

class ChildClass2 
    include Base 
end 

Tôi làm điều này trong ứng dụng Rails 5 của tôi và nó hoạt động chắc chắn.

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