2017-01-10 6 views
3

Я работаю на платформе CRM.Добавить пользовательские поля в объект в приложении ROR

Я бы хотел, чтобы мои пользователи добавили, отредактировали и удалили пользовательские поля в Client, Contact и Lead объектов. Эти поля могут быть простым текстовым полем, списком, флажком, тегом и т. Д. Эти поля могут потребоваться или нет. Эти поля могут иметь пользовательскую проверку (этот пользователь будет определять).

Скажите, что одна компания из финансовых учреждений хотела бы добавить доход в объект Client, а другая добавила бы конфигурацию заказа в Lead объект.

Есть ли какое-либо решение «уровня предприятия» (драгоценный камень ROR) для моей проблемы.

Причина, по которой я знаю около Custom configuration и config gem, но она не выглядит достаточно расширяемой.

+0

Является ли ваше приложение многопользовательским? –

+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

Если предположить, что база данных является реляционная:

Я хотел бы предложить использовать Entity-Attribute-Value шаблона: https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model.

Вот драгоценный камень для него: https://github.com/iostat/eav_hashes

Также документо-ориентированная база данных как MongoDB будет вариант, если вы когда-либо рассмотреть вопрос об изменении базы данных. Это схематично, поэтому вы можете иметь разные атрибуты для разных экземпляров.

1

Я не знаю ни из вариантов коробки, но вы могли бы быть лучше добавить собственные на что-то вроде этого в любом случае , Это позволит вам проявлять большую гибкость и не должно быть ужасно.С точки зрения модели, я бы, вероятно, пойти с таблицей наследования одной таблицы для полей, вероятно, используя jsonb столбец для параметров настройки (при условии, Postgres):

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

Вы можете подклассы по мере необходимости для различного применения -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_accessor сделать для более чистого интерфейса к колонку jsonb.

Аналогично, наследование одной таблица выглядит она также может иметь смысл для контактов, а также, не уверен, что базовая таблица должна быть, но, возможно, что-то вроде:

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

class Contact < ApplicationRecord 
end 

class Lead < Contact 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^