rails动态创建db中的表

时间:2012-11-06 08:46:39

标签: ruby-on-rails activerecord

通常在数据库中创建/更改表我使用迁移(手动运行rake db:migrate)然后在我的代码中使用ActiveRecord。这非常酷,因为我不必担心数据库中的数据表示以及特定类型的db(sqlserver,pg或其他)。

但现在客户希望能够自己创建“东西”,比如说,他开始销售电脑,所以他想要一个界面,他可以动态创建一个具有“名称”等属性的对象“计算机” ,RAM,HD,......“。在db中使用所有这些字段创建单独的表似乎很自然。但是我怎么能在RoR中做到这一点并保留所有关于ActiveRecord的好东西?

请建议。

2 个答案:

答案 0 :(得分:2)

通常的做法是完全相反:

  • 拥有对象类型表
  • 拥有每个对象类型的字段名称表
  • 有一个非常大的表,其中包含任何类型的每个对象的所有自定义属性

这称为EAV(实体 - 属性 - 值模型,请参阅http://en.wikipedia.org/wiki/Entity-attribute-value_model)。它的规模非常糟糕。

或者,您可以使用store文本列而不是大EAV表(请参阅http://api.rubyonrails.org/classes/ActiveRecord/Store.html),这样您就不必进行那些典型的EAV难度属性检索。您仍然需要存储“对象类型”定义的某个位置,因此在构建表单和表时可以使用预期的字段等。

此方法的问题在于您无法在这些属性上查询(where / join / select),因为它们不是列。有很多解决方案:

  • 不要对这些属性进行过滤(meh ...)
  • 拥有能够进行分面搜索的外部搜索服务器
  • (正如@Amar所​​说)使用文档数据库
  • 使用postgreSQL并使用hstore而不是简单的序列化列。

答案 1 :(得分:1)

NoSQL数据库(文档数据库Mongodb,CouchDB)最适合这个或使用redis。根据我的想法,您可以使用Vertical Table concept尝试为MySQL运行Rails 2.x Demo of application。 您可以尝试使用Mongodb,检查是否需要。