通常在数据库中创建/更改表我使用迁移(手动运行rake db:migrate),然后在我的代码中使用ActiveRecord.这非常酷,因为我不必担心db中数据的表示以及特定类型的db(sqlserver,pg或其他).
但是现在一个客户想要能够自己创建“东西”,就像他开始销售电脑一样,所以他想要一个界面,他可以动态地创建一个具有“名称,RAM,”等属性的对象“计算机”.高清,……“在db中使用所有这些字段创建单独的表似乎很自然.但是我怎么能在RoR中做到这一点并保留所有关于ActiveRecord的好东西?
请建议.
解决方法
通常的做法是完全相反:
>有一个对象类型的表
>为每种对象类型都有一个表名
>拥有一个非常大的表,其中包含任何类型的每个对象的所有自定义属性
这称为EAV(实体 – 属性 – 值模型,见http://en.wikipedia.org/wiki/Entity-attribute-value_model).它的规模非常糟糕.
或者,您可以使用商店文本列而不是大EAV表(请参阅http://api.rubyonrails.org/classes/ActiveRecord/Store.html),这样您就不必进行那些典型的EAV难度属性检索.您仍然需要存储“对象类型”定义的某处,因此在构建表单和表时可以使用预期的字段等.
这种方法的问题在于您无法在这些属性上查询(where / join / select),因为它们不是列.有很多解决方案:
>不要对这些属性进行过滤(meh ……)>拥有一个能够进行分面搜索的外部搜索服务器>(正如@Amar所说)使用文档数据库>使用postgresql并使用hstore而不是简单的序列化列.