2011-04-14 58 views
7

我有一個設計問題,我想走過去。動態字段與軌道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" 

然後我有一個部分爲每個字段類型的編輯和顯示。

創建之後,一個產品可能是這樣的MongoDB中:

{"field_data":{ 
    "itinerary": "FUN!", 
    "code": "AHKDYK", 
    "infant_age": { "max": 2, "min": 0 } 
}} 

這是一個好辦法?

回答

5

當然,這會工作 - 但是你知道你不需要去Mongo只是爲了能夠在數據庫中存儲值的散列。您也可以將一個屬性設置爲serialize,然後Rails會將其轉換爲YAML並返回到您返回的(簡單)對象。

這是您描述的模式的一種相當常見的(也是非常可行的)方法。

0

您可以將這些字段定義爲Mongoid :: Document字段並使用Product.fields作爲自省。然後,您可以利用ActiveModel的功能,如驗證以及國際化(如果需要)。