5

Rails 3 で mongoid を使用していますが、最近非常に難しい問題に直面しており、アドバイスが必要です。

私はCMSに取り組んでおり、アイデアの1つは、CMSがいくつかの基本的なモデル定義を提供し、エンドユーザーが必要に応じて独自の定義とコントロールで基本クラスを拡張し、それらを異なるコレクション(テーブル)に保存することでした。

class DcPage
  include Mongoid::Document

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

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

mongoid の最後のバージョンまで、これは機能し (少しのハックで)、データは my_pages コレクションに保存されていました。何らかの問題により、mongoid はこの動作をサポートしなくなり、データは常に dc_pages コレクションに保存されます。

私の問題を説明する際に、mongoid チームは ActiveSupport::Concern を使用することを提案し、例を提供してくれました。拡張クラスが同じソースファイルで定義されている場合、これは完全に機能します。ところで。実際には決して起こりません。

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

これまでのところ、2 番目のファイルで基本的なソース ファイルが必要な場合に機能することがわかりました。これは次のようになります: require '/some/path/to/my/gem/app/models/dc_page.rb

あなたは今私の痛みを見ることができますか?もちろん、基本的なソース ファイルは gem に戻されるため、移動ターゲットになります。

より良い解決策を教えてください。

によって TheR

4

1 に答える 1

1

これが機能しない理由は、これが単一テーブル継承のパターンであるためです。これを機能させるには、テーブルの継承をオフにする必要があります。

ただし、mongoid 開発者からの提案は、この場合の正しいルートです。モジュール/クラスを正しく要求するだけでよいようです。

于 2013-04-28T18:38:01.597 に答える