Поля динамической модели, заданные пользователем в Rails

кто-нибудь знает о драгоценном камне или хорошей реализации, позволяющей пользователю добавлять поля в модель?

Ex.

пользователь хотел бы добавить поле "внутренние заметки" в модель контакта. В интерфейсе они просто выберут "новое поле" > "Тип: текст"

спасибо

2 ответов


извините, я не знаю ни одного плагина для этого. Но у меня есть предложение по реализации.

идея состоит в том, чтобы добавить модель "DynamicField", которая была бы отношением has_many к контактной модели. Если в модели контакта отсутствует метод, проверьте наличие динамического поля для его извлечения.

class DynamicField < ActiveRecord::Base
    belongs_to :contact
end


class Contact < ActiveRecord::Base
    has_many :dynamic_fields

    def method_missing(sym, *args, &block)
        begin
            super
        rescue
            field = dynamic_fields.find_by_name(sym)
        end
        raise ActiveRecord::NoMethodError if field.nil?
        field.value
    end
end

вам нужно будет добавить регулярное выражение, Если вы хотите добавить виртуальные атрибуты с помощью метода attribute= (обнаружение наличия " = " и выполнение обновления, а не только получение значения). Но у вас уже есть идея.

Если метод не существует, мы проверяем динамические поля, если есть один с таким же именем. Если нет (поле.шь?), мы поднимаем NoMethodError. Иначе мы его вернем.

таким образом, вы можете получить список всех ваших полей со следующим :

Contact.find(:first).dynamic_fields

и получить конкретный один со следующим :

Contact.find(:first).my_dynamic_field

вот еще один способ сделать это.

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

class MyModel < ActiveRecord::Base
  ...
  def self.add_column(name, type, args= {})
    ActiveRecord::Migration.add_column table_name, name, type, args
  end
end