2013-04-28 33 views
5

Tôi đang sử dụng mongoid với đường ray 3 và đã đến gần đây với một vấn đề rất khó khăn và tôi cần một lời khuyên.ActiveSupport :: Quan tâm và mở rộng mô hình mongoid

Tôi đang làm việc trên một CMS và là một trong những ý tưởng là CMS sẽ cung cấp một số cơ bản mô hình định nghĩa và người dùng cuối sẽ, nếu cần thiết, mở rộng lớp cơ bản với các định nghĩa và điều khiển riêng của mình và lưu chúng trong bộ sưu tập khác nhau (những cái bàn).

class DcPage 
    include Mongoid::Document 

    field a .... 
    belongs_to b .... 
    validates a .... 
end 

class MyPage < DcPage 
    field c .... 
    validates c .... 
end 

Cho đến phiên bản cuối cùng của mongoid này làm việc (với ít hack) và dữ liệu sẽ được lưu vào bộ sưu tập my_pages. Do một số vấn đề, mongoid no còn hỗ trợ hành vi và dữ liệu này luôn được lưu vào bộ sưu tập dc_pages .

Khi giải thích sự cố của tôi, nhóm mongoid đề nghị tôi sử dụng ActiveSupport :: Quan tâm và cung cấp cho tôi một ví dụ. Mà hoạt động hoàn toàn OK nếu lớp mở rộng được định nghĩa trong cùng một tệp nguồn. Trong đó btw. không bao giờ xảy ra trong praxis.

module CommonBehaviour 
    extend ActiveSupport::Concern 

    included do 
    field :subject, type: String, default: '' 
    # ... 
    end 
end 

class DcPage 
    include Mongoid::Document 
    include CommonBehaviour 
end 

class MyPage 
    include Mongoid::Document 
    include CommonBehaviour 
end 

Cho đến nay tôi đã phát hiện ra rằng nó hoạt động nếu tôi yêu cầu tệp nguồn cơ bản trong tệp thứ hai của tôi. Hình như sau: yêu cầu '/some/path/to/my/gem/app/models/dc_page.rb

Bây giờ bạn có thể thấy nỗi đau của tôi không. Tất nhiên, tệp nguồn cơ bản sẽ được sao lưu vào đá quý và sẽ trở thành mục tiêu di chuyển.

Hãy giúp tôi giải pháp tốt hơn.

bởi Ther

+1

Bạn có thêm chức năng phổ biến trực tiếp vào nguồn đá quý không? Bạn đang cố thay đổi lớp nào? – Chris

+0

Tôi giả định rằng lớp CommonBehaviour modul và DcPage nằm trong cùng một tệp nguồn ../app/models/dc_page.rb được chứa bên trong tệp gem. Lớp MyPage được định nghĩa bên trong ứng dụng hiện tại là ../app/models/my_page.rb và nó sẽ mở rộng lớp DcPage. Trong kịch bản này, nó bao gồm mô-đun CommonBehaviur được bao gồm trong cả hai lớp. –

+0

Bạn đã bao giờ tìm được giải pháp tốt hơn cho điều này chưa? Tôi gặp vấn đề tương tự. –

Trả lời

1

Lý do này không hoạt động là bởi vì đây là mô hình cho các thừa kế bảng duy nhất. Bạn cần phải tắt tính năng kế thừa bảng để làm việc này.

Tuy nhiên, đề xuất từ ​​nhà phát triển mongoid là tuyến đường chính xác trong trường hợp này. Có vẻ như bạn chỉ cần yêu cầu mô-đun/lớp học của mình một cách chính xác.

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