3

紛らわしいタイトルかもしれませんが、他にどう言えばいいのかわかりません。例はそれをより明確にするはずです。同じ属性の多くを共有する多くの異なるモデルがあります。したがって、各モデルで同じ属性を指定し、次にその特定のモデルに固有の属性を指定する必要があります。

これらの基本的な属性をリストするクラスを作成し、単一テーブルの継承を使用せずにそのクラスから継承する方法はありますか? すべての共有属性と Mongoid インクルードを単一のモデルに入れ、他のモデルのその基本モデルから継承すると、STI が適用され、すべてのモデルが単一の mongodb コレクションに格納され、「_type」フィールドで区別されます。

これは私が持っているものです:

class Model_1
  include Mongoid::Document

  field :uuid, :type => String
  field :process_date, :type => String
  ...
end

class Model_2
  include Mongoid::Document

  field :uuid, :type => String
  field :process_date, :type => String
  ...
end

しかし、これは私が求めている機能です:

class Base_model
  field :uuid, :type => String
  field :process_date, :type => String
end

class Model_1 < Base_model
  # To ensure STI is not enforced
  include Mongoid::Document

  # Attribute list inherited from Base_model
end

問題は、Base_model に "include Mongoid::Document" がない場合、その基本モデルは "field ..." 機能を認識しないことです。ただし、基本モデルに mongoid インクルードを配置して継承すると、STI が適用されます。

この特定の状況で STI を実行することはできませんが、同じ属性リストが何度も指定された複数のモデルを持つのはコーディングの悪夢です (モデルの数が増えており、それぞれが約 15 ~ 20 の属性を共有しているため、いつでもモデル名を変更する必要があります。どこでも変更するのは大変です...)。

4

3 に答える 3

4

モジュールで共通の属性を定義し、それを含めることができます。

require 'mongoid'

module DefaultAttrs

  def self.included(klass)
    klass.instance_eval do
      field :uuid, :type => String
    end
  end

end

class Foo
  include Mongoid::Document
  include DefaultAttrs

  field :a, :type => String
end

class Bar
  include Mongoid::Document
  include DefaultAttrs

  field :b, :type => String
end
于 2012-04-25T19:23:26.700 に答える
0

まったく同じ質問があり、最初は mixin アプローチを使用したいと考えていました。しかし、何人かの専門家と話し合った結果、ユースケースによっては、mongoids の単一テーブル継承 (すべての子要素に対して 1 つのコレクション) を使用する方がよい場合があることがわかりました。ここで私の投稿を参照してください: 継承されたオブジェクトの単一コレクションと個別コレクション

于 2012-05-24T14:32:03.493 に答える