У меня есть проблема с дизайном, которую я хочу решить.
Я создаю приложение Rails 3, в котором будут храниться продукты разных компаний. Я хотел бы определить большой набор полей, и каждый продукт может выбрать поля, которые к нему применимы.
Типы полей будут однострочными текстовыми полями, многострочными текстовыми полями, параметрами радио или выбора, параметрами флажков, датами, продолжительностью или чем-то более индивидуальным. Мне нужно иметь возможность динамически отображать поля на основе этого типа для редактирования и отображения.
Моя текущая идея состоит в том, чтобы использовать MongoDB и хранить все в хэше продукта.
class Product
include Mongoid::Document
def self.field_definitions
[{ :name => :code, :label => 'Code' },
{ :name => :itinerary, :type => :multiline, :label => 'Itinerary', :category => :tour},
{ :name => :infant_age, :type => :age_range, :label => 'Infante age range', :category => :tour},
...
]
end
embedded_in :company
field :field_data, type:Hash
end
Затем визуализируйте поля для нового/редактирования примерно так:
= form_for Product.new do |f|
= f.fields_for :field_data do |f|
%ol
- Product.field_definitions.each do |field_definition|
%li
= f.label field_definition[:name], field_definition[:label]
= render "products/edit_fields/#{field_definition[:type] || 'singleline'}", :f => f, :field_definition => field_definition
= f.submit "Create"
Затем у меня есть частичное для каждого типа поля для редактирования и отображения.
После создания Product может выглядеть в mongodb следующим образом:
{"field_data":{
"itinerary": "FUN!",
"code": "AHKDYK",
"infant_age": { "max": 2, "min": 0 }
}}
Хороший ли это подход?