2017-01-10 1 views
3

저는 CRM 플랫폼에서 작업하고 있습니다.ROR 응용 프로그램에서 객체에 사용자 정의 필드 추가

내 사용자가 Client, ContactLead 개체에 사용자 정의 필드를 추가, 편집 및 삭제하고 싶습니다. 이러한 필드는 일반 텍스트 필드, 목록, 확인란, 태그 등일 수 있습니다. 이러한 필드는 필수 요소 일 수 있습니다. 해당 필드에는 사용자 정의 유효성 검사가있을 수 있습니다 (사용자가 정의 함).

금융 회사의 한 회사가 Client 개체에 소득을 추가하고 싶다고 말하면 다른 하나는 Lead 개체에 주문 구성을 추가합니다.

내 문제의 "엔터프라이즈 수준"솔루션 (ROR 젬)이 있습니까?

왜냐하면 나는 Custom configurationconfig gem을 알고 있지만 충분히 확장 성이 없습니다.

+0

앱은 멀티 테넌트 (multi-tenant)인가? –

+0

예, 다중 거주자입니다. –

답변

4

어려운 질문이지만, 어떻게 처리 할 것인가? 모든 객체를 CustomField 개체에서 파생시킨 다음, Field 모델과 일대 다 관계를 만들 것입니다. 이런 식으로 :

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 개체의 데이터를 저장하는 데 사용할 수있는 각 필드 유형별로 테이블을 생성합니다. 예를 들어, Client 필드 지정자를 확인하고 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를같은 데이터베이스. 그것은 schemaless이므로 다른 인스턴스에 대해 다른 속성을 가질 수 있습니다.

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 

그런 다음 다른 사용하기 위해 필요한 하위 클래스 : 모델의 관점에서, 난 아마 아마 사용자 정의 옵션에 대한 jsonb 열 (가정 포스트 그레스)를 사용하여 필드에 단일 테이블 상속 테이블로 가고 싶어 -cases : 당신은 jsonb 열에 깨끗한 인터페이스 만들기 위해 jsonb_accessor 같은으로 볼 수

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 

.

은 마찬가지로, 단일 테이블 상속은 또한뿐만 아니라 연락처에 대한 감각을 만들 수 있습니다 그것과 같은 기본 테이블이 있어야 할 무엇인지,하지만 어쩌면 같은 :

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

class Contact < ApplicationRecord 
end 

class Lead < Contact 
end