【发布时间】:2013-06-18 06:38:44
【问题描述】:
场景
假设用户是推销员。 User 模型有许多 log_entries 用作销售数据的日常日志。用户还具有允许他们选择在其 log_entry 表单中可见的字段的首选项。所以,如果他们选择菠萝、香蕉和葡萄……这些就是表格中的字段。如果这些选择发生变化,数据不会丢失……只是在表单中不可见。 现在,假设用户刚刚选择了蔓越莓销售账户,但蔓越莓在他们的用户偏好表单中不是一个可选择的属性。他们需要能够创建那个“类别”。现在,菠萝季节结束了,所以他们登录到偏好设置并取消选中菠萝框并选中草莓框。现在,当他们在日志中输入数据时,将有一个草莓数据字段,但不是菠萝。菠萝数据没有消失……只是没有显示出来。
这种情况会带来一些挑战。一个是作为开发人员我不提前知道数据库列名称,因为用户可以动态创建新的“类别”(我可以要求用户联系我以根据需要添加更多,但是......)。而且,当用户创建一个新类别时...... log_entries 表不会有一个列来表示该新数据。
如何管理动态数据库列? postgres hstore 可以处理这个吗?
一行是基于日期的属于用户的条目。每列都包含特定于某个属性的数据(例如...一列可以标题为“草莓”,它将包含当天售出的单位数量)
【问题讨论】:
-
hstore 似乎是要走的路。但是,如果一个用户创建了一个类别,那么我希望该类别可供所有用户使用。 hstore 似乎是特定于用户的,可能不是很有条理
-
我能想到的最佳选择是为我能想到的用户可能需要登录的每种数据类型创建一个列...然后让他们提交请求让我添加更多数据列(如果需要)。
-
我刚刚想到的另一个选项是在数据库中创建一组自定义列,例如...custom_one、custom_two 等(可能有 10 个)。然后,创建一个包含两个字段的 Usercustom 模型...custom_col_ref:string 和 custom_col_label:string。 custom_col_ref 将存储存储数据的实际列名,而 custom_col_label 将存储要在表单中使用的标签。然后,使用 if 语句在表单中显示/隐藏该字段..."if Usercustom.find_by_custom_col_ref("custom_one").exists?"... 在表单中显示该列的字段。
标签: ruby-on-rails-3 postgresql