2012-04-25 4 views
3

おそらく混乱するタイトルですが、それをどのように置くのかはわかりません。例はそれをより明確にすべきである。私は同じ属性の多くを共有する多くの異なるモデルを持っています。だから各モデルでは、私はそれらの同じ属性を指定し、その特定のモデルに固有の属性を指定する必要があります。MongoDBをmongoidアダプター経由で使用するRails 3 - 単一表継承を使用せずに属性指定を共有する方法はありますか?

これらの基本属性を列挙し、単一表継承を使用せずにそのクラスから継承するクラスを作成する方法はありますか?共有属性とモンゴイードをすべて単一のモデルに入れ、他のモデルのベースモデルから継承すると、STIが強制され、すべてのモデルが単一のmongodbコレクションに格納され、「_タイプ」フィールドで区別されるからです。

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

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 

しかし、これは私が後だ機能です:問題はあなたが「Mongoidが含まれていない場合ということです

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 

:: Document "をBase_modelに入れた場合、その基本モデルは" field ... "機能を知らない。しかし、モンゴイドをベースモデルに入れてそれを継承すると、STIが強制されます。

この特定の状況でSTIを実行することはできませんが、複数のモデルを持ち、すべて同じ属性リストが何度も繰り返し指定されています(モデル数が増え、モデル名を変更する必要があるときはいつでもどこでも変更する努力が...)。

答えて

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 
+0

。それはまさに私が探していたものです。モジュールはモデルのように扱われますか?モジュールをapp/modelsフォルダに入れるのが標準ですか、それとも一般的に/ libフォルダに入っていますか?決して実際にモジュールを使用する必要はなく、そうしたメタプログラミングを行う必要はありませんでしたが、それは私が探していた正確な答えです。 –

+0

モジュールは単なるコンテナです。クラスに似ていますが、インスタンス化することはできませんので、Rubyプログラミング言語ではよくミックスインとして使用されます。 libフォルダは、それ(または初期化子)のための良い場所です。 –

0

私はまったく同じ質問をしていましたが、最初はmixinのアプローチに行きたいと思っていました。しかし、いくつかの専門家と話をした後、ユングケースの単一のテーブル継承(すべての子要素に対して1つのコレクション)を使用することは、ユースケースに応じて移動する方法になる可能性があります。ここに私の記事を参照してください。 single collection vs. separate collections for inherited objects

0

あなたは、新しいモジュールにそれらを束ねることができ、すなわち

かなりクールだ
module Mongoid 
    module Sunshine 
    extend ActiveSupport::Concern 

    included do 
     include Mongoid::Document 
     include Mongoid::Timestamps 
     include Mongoid::TouchParentsRecursively 
     include Mongoid::Paranoia 
     include Mongoid::UUIDGenerator 
    end 
    end 
end 


class School 
    include Mongoid::Sunshine 
end 
関連する問題