Поля динамической модели, заданные пользователем в 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