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
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
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. –
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ự. –