Хранение данных из динамических форм - PullRequest
3 голосов
/ 15 июня 2011

Я работаю над генератором динамических форм.Кто-то может создать такие поля, как: строка, текст, логическое значение, число, файл и т. Д.

Существуют ли какие-либо драгоценные камни или рекомендации для хранения данных из таких динамических форм?значит, я могу создать несколько таблиц для каждого типа данных, или я могу сохранить их все как TEXT с флагом, тип которого должен быть преобразован.

UPD

или я бы лучше использовал здесь nosql?

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Я считаю, что Mongodb - это правильный выбор для этого приложения, поскольку он не применяет никакой схемы, это хороший выбор для произвольных данных.

Кроме того, он поддерживает все типы данных, которые вы ожидали. так легко.

Иметь коллекцию форм, которая выглядит следующим образом (код Ruby Mongoid)

  class XForm
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

       field :name, :type => String
       field :user, :type => BSON::ObjectId     

       embeds_many :formfields
  end

и

 class Formfields
  include Mongoid::Document

     field :name, :type => String
     field :kind, :type => String
     #field :value, :type => String -> dont add it in formfields, make it dynamic sine the type varies

  embedded_in :xform
  end

Чтобы добавить поле значения в качестве динамического поля, вам нужно включить allow_dynamic_fields: true в mongoid.yml

и создайте новое поле, подобное этому

  form = XForm.new(:name=>'test form',:user => current_user.id)
   #for integer field
   form.formfields << Formfields.new(:name => "Age",:kind=>"Integer", :value => 21)
   #for bool field
   form.formfields << Formfields.new(:name => "isMarried",:kind=>"Boolean",:value => true)
   #for string field
   form.formfields << Formfields.new(:name => "name",:kind=>"String",:value => "ram")

Надеюсь, это поможет

2 голосов
/ 15 июня 2011

Мне нравится этот подход.

class User < ActiveRecord::Base
  [:field_1, :field_2, :field_3].each do |method|
    define_method method do
      workable_arbitrary_content[method]
    end

    define_method "#{method}=" do |value|
      data = workable_arbitrary_content.merge(method => value)
      self.arbitrary_content = YAML.dump(data)
    end
  end

  private
    def workable_arbitrary_content
      YAML.load(arbitrary_content || "") || {}
    end
end

В этом случае вы создаете 3 виртуальных поля, которые сохраняются как YAML.Создайте поле в users с именем arbitrary_content, которое имеет тип text .

Вот некоторые спецификации для кода выше.

describe User do
  context "virtual fields" do
    before(:each) do
      @user = User.new
    end

    it "should be able to handle strings" do
      @user.field_1 = "Data"
      @user.field_1.should eq("Data")
    end

    it "should be able to handle integers" do
      @user.field_2 = 1
      @user.field_2.should eq(1)
    end

    it "should be able to handle symbols" do
      @user.field_3 = :symbol
      @user.field_3.should eq(:symbol)
    end

    it "should be possible to override a field" do
      @user.field_3 = :symbol
      @user.field_3 = "string"

      @user.field_3.should eq("string")
    end

    it "should be possible to set more then one field" do
      @user.field_1 = :symbol
      @user.field_2 = "string"

      @user.field_1.should eq(:symbol)
      @user.field_2.should eq("string")
    end
  end
end
...