Динамические поля с Rails 3

У меня есть проблема с дизайном, которую я хочу решить.

Я создаю приложение 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 } 
}}

Хороший ли это подход?


person whatupdave    schedule 14.04.2011    source источник


Ответы (2)


Конечно, это сработает, но знаете ли вы, что вам не нужно переходить к Mongo только для того, чтобы иметь возможность хранить хэш значений в БД. Вы также можете установить атрибут как serialize, тогда Rails преобразовать его в YAML и обратно в (простой) объект на обратном пути для вас.

Это довольно распространенный (и очень работоспособный) подход к описанному вами шаблону.

person smathy    schedule 15.04.2011

Вы можете определить эти поля как поля Mongoid::Document и использовать Product.fields для самоанализа. Затем вы можете использовать функции ActiveModel, такие как проверки, а также i18n (при необходимости).

person Roman    schedule 15.04.2011