2017-01-10 5 views
3

私はCRMプラットフォームで作業しています。RORアプリケーションのオブジェクトにカスタムフィールドを追加

ClientContact、およびLeadオブジェクトのカスタムフィールドの追加、編集、削除をご希望ですか。これらのフィールドは、プレーンテキストフィールド、リスト、チェックボックス、タグなどであってもよい。これらのフィールドは必須であってもなくてもよい。これらのフィールドには、ユーザーが定義するカスタム検証がある場合があります。

財務のある企業がClientオブジェクトに収益を追加したいとします。もう1つはLeadオブジェクトに注文構成を追加します。

問題の「エンタープライズレベル」ソリューション(ROR宝石)がありますか?

私はCustom configurationconfig gemについて知っていますが、十分に拡張可能ではありません。

+0

アプリのマルチテナントです:それはまた、ベーステーブルがどうあるべきかわからない、だけでなく連絡先の意味を成すかもしれないが、おそらくのようなものは以下のように

同様に、単一テーブル継承に見えますか? –

+0

はい、マルチテナントです。 –

答えて

4

難しい質問ですが、これは私がそれに対処しようとする方法です:すべてのオブジェクトをCustomFieldオブジェクトから派生させるとしたら、それとFieldモデルの間に1対多の関係を作成します。

create_table :field_types do |t| 
    t.string :name # This would identify the fields: checkbox, plain text, etc 
end 

create_table :fields do |t| 
    t.belongs_to :custom_field, null: false, index: true 
    t.belongs_to :field_type, null: false, index: true 
    t.string :name 
end 

class Field < ApplicationRecord 
    belongs_to :custom_field 
    belongs_to :field_type 
end 

class CustomField < ApplicationRecord 
    has_many :fields 
end 

このようにして、データベースの指定されたフィールドを調べて、ビューにマウントすることができます。

次に、ユーザーがCustomFieldオブジェクトのデータを保存するために使用できるフィールドの種類ごとにテーブルを作成します。例えば、私はクライアントのフィールド指定子をチェックし、チェックボックスAとBでビューをマウントします。次に、チェックボックスからデータを取得し、テーブルにCheckboxesという識別子を付けて保存します。クライアントから来ました。

あなたが何をする必要があるかによって、私の頭に浮かぶ別のアイデアは、データをjson文字列としてデータベースに保存することです。このようにして、さまざまなフィールドに異なる値を設定することができます。コードとデコードを保存してデータベースからロードするだけです。それは少し混乱した場合

申し訳ありません...とにかく、それは

1

は、データベースを仮定すると、リレーショナルです: https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

私はエンティティ - 属性値パターンを使用することをお勧めします。ここで

はそれのための逸品です:あなたは、データベースを変更することを検討している場合 https://github.com/iostat/eav_hashes

またドキュメント指向データベースのようなMongoDBのは、オプションになります。それはスキーマレスなので、異なるインスタンスに対して異なる属性を持つことができます。

1

は、私は可能なボックスのオプションのうちいずれかの認識していないよ役立ちますが、とにかくこのような何かのオフ自分自身を転がり方がよいかもしれません願っています。これにより、柔軟性が向上し、実装するのが面倒ではありません。

create_table :fields do |t| 
    t.string :type, null: false # TextField, ListField, etc. 
    t.jsonb :config, default: {}, null: false 
    t.belongs_to :contact 
end 

あなたはその後、別の使用のために必要なのサブクラスを作成することができます:モデルの面では、私はおそらく、おそらく(postgresのを想定)カスタマイズオプションについてjsonb列を使用して、フィールドのための単一テーブル継承のテーブルに行くと思います-cases:

class Field < ApplicationRecord 
    belongs_to :contact 
end 

class TextField < Field 
    def required=(required) 
    config[:required] = required 
    end 
end 

class CheckboxField < Field 
    def default_checked=(default_checked) 
    config[:default_checked] = default_checked 
    end 
end 

あなたはjsonb列にきれいなインターフェースのために作るためにjsonb_accessorのようなものの中に見ることができます。

create_table :contacts do |t| 
    t.string :type, null: false # Contact, Lead, Client 
end 

class Contact < ApplicationRecord 
end 

class Lead < Contact 
end 
関連する問題