Ruby on rails RubyonRails Web应用程序中的动态字段

Ruby on rails RubyonRails Web应用程序中的动态字段,ruby-on-rails,xml,mongodb,dynamic,database,Ruby On Rails,Xml,Mongodb,Dynamic,Database,我正在开发一个RubyonRails应用程序,用于通过web表单从用户处收集产品数据。一个数据库表包含所有ProductTypes,另一个表包含ProductAttributes,ProductTypes\u ProductAttributes是映射分配给特定产品类型的属性的关系表。然后,为每个特定产品收集的数据存储在Products表中(每个属性都有一列/字段,如果该属性与产品无关,则该列/字段可能为空) 我想添加一个功能,允许管理员用户向系统添加新的ProductAttributes,然后将

我正在开发一个RubyonRails应用程序,用于通过web表单从用户处收集产品数据。一个数据库表包含所有ProductTypes,另一个表包含ProductAttributes,ProductTypes\u ProductAttributes是映射分配给特定产品类型的属性的关系表。然后,为每个特定产品收集的数据存储在Products表中(每个属性都有一列/字段,如果该属性与产品无关,则该列/字段可能为空)

我想添加一个功能,允许管理员用户向系统添加新的ProductAttributes,然后将它们分配给某些ProductType。除了坚持收集的特定产品外,没有问题。这将需要在运行时向Products表动态添加一个新的属性字段。这是我有点困惑的地方,因为这是最好的方法

1) 将产品存储在XML文档中。。。这将避免在数据库中为不属于该产品的ProductType的属性保留一堆空字段,这意味着可以保存新的属性类型,而不会出现任何问题。不过,我有点厌倦了将数据存储在XML文件中,我一直认为它们是传输和移动数据的一种手段,而不是存储数据

2) 继续使用RDBMS,但包括一个BLOB字段来存储XML中产品的动态属性,而传统字段用于产品代码、描述等

3) 最后,是否有针对上述问题的RDBMS解决方案?我看过一些关于MongoDB的讨论,但我承认我对它并不熟悉,因为它有更传统的DB的背景

我想知道是否有人在这方面有任何经验和建议,他们希望传递?我想要一个与RubyonRails集成的东西,当一个字段被添加到DB表时,它允许动态添加持久性字段,而不需要任何代码更改

干杯


Steve

这种问题在电子商务应用中非常常见。产品属于不同的产品类型,因此需要动态的、用户定义的属性

首先,您可以看看一些现有的开源Rails电子商务平台。与重新发明车轮相比,将它们系在一起可能更容易。我认为目前最受欢迎的是:

不过,关于您的问题,您似乎已经在正确的轨道上为产品类型和产品属性创建单独的表,然后创建一个连接它们的表

不确定您是否愿意更改当前的数据库设计,但如果愿意,您可能不需要担心向product表中动态添加新字段

在我看来,您想要做的事情可以通过稍微不同的数据库设计来完成。因此,您的模式可能是这样的:

create_table "products" do |t|
  t.string "name"
  t.integer "product_type_id"
  # ... other fields
end

create_table "product_types" do |t|
  t.string "name"
  # ... other fields
end

create_table "product_attributes" do |t|
  t.string "name"
  # ... other fields
end

create_table "product_attributes_product_types" do |t|
  t.integer "product_attribute_id"
  t.integer "product_type_id"
end

create_table "product_product_attributes" do |t|
  t.integer "product_id"
  t.integer "product_attribute_id"
  t.string "value"
end
因此,您可以将数据存储在单独的
product\u product\u attributes
表中,而不是保存实际产品数据的
products
表中

当管理员用户为每个产品填写表单时,他/她将首先选择产品所属的正确产品类型。设置产品类型后,管理表单中将仅显示与该产品类型关联的属性。将产品属性分配给不同的产品类型是一项单独的管理任务

希望这有帮助

~z~安德里亚