ruby-on-rails - Rails 3 的动态字段

标签 ruby-on-rails ruby architecture mongodb mongoid

我有一个设计问题想要解决。

我正在构建一个 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 } 
}}

这是一个好方法吗?

最佳答案

当然,这行得通 - 但你知道你不需要去 Mongo 只是为了能够在数据库中存储值的哈希值。您还可以将属性设置为 serialize然后 Rails 会将其转换为 YAML 并在为您返回的过程中返回一个(简单)对象。

对于您描述的模式,这是一种相当常见(并且非常可行)的方法。

关于ruby-on-rails - Rails 3 的动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5670975/

相关文章:

javascript - rails : Can't load two Jquery scripts in my page

ruby - 在 YAML 变量中包含 jekyll/liquid 模板数据?

ruby-on-rails - 用于构建社交网站的 Ruby 电子书

ruby-on-rails - 为什么运行 rake db :migrate? 时未(正确)生成 schema.rb

c# - 架构/设计模式问题

hadoop - Flume 架构 : Events passing to Channel

android - 如何设计移动Android应用程序的架构

ruby-on-rails - 设计注册表单的路线

ruby-on-rails - 如何在 DotCloud.com 上推送我的 Rails 应用程序的 Git 更新而不丢失 SQLite prod 数据库

ruby-on-rails - 在 after_save 回调中使用 `self` 对象时出错