Ruby on rails 3 基于用户首选项的动态表列 脚本

Ruby on rails 3 基于用户首选项的动态表列 脚本,ruby-on-rails-3,postgresql,Ruby On Rails 3,Postgresql,假设用户是销售员。用户模型有许多日志项,用作销售数据的每日日志。用户还具有首选项,允许他们选择在日志输入表单中可见的字段。所以,如果他们选择了菠萝、香蕉和葡萄……这些就是将形成这种形态的田地。如果这些选项更改,数据不会丢失…只是在表单中不可见。 现在,假设用户刚刚获得了蔓越莓销售帐户,但蔓越莓在其用户首选项表单中不是可选择的属性。他们需要能够创建那个“类别”。现在,菠萝季节结束了,所以他们登录到那里的首选项,取消选中菠萝框和草莓框。现在,当他们在日志中输入数据时,会有一个草莓的数据字段,而不是菠

假设用户是销售员。用户模型有许多日志项,用作销售数据的每日日志。用户还具有首选项,允许他们选择在日志输入表单中可见的字段。所以,如果他们选择了菠萝、香蕉和葡萄……这些就是将形成这种形态的田地。如果这些选项更改,数据不会丢失…只是在表单中不可见。 现在,假设用户刚刚获得了蔓越莓销售帐户,但蔓越莓在其用户首选项表单中不是可选择的属性。他们需要能够创建那个“类别”。现在,菠萝季节结束了,所以他们登录到那里的首选项,取消选中菠萝框和草莓框。现在,当他们在日志中输入数据时,会有一个草莓的数据字段,而不是菠萝。菠萝数据没有消失…只是没有显示出来

这种情况带来了一些挑战。一个是,作为一名开发人员,我事先不知道数据库列名,因为用户可以动态创建新的“类别”(我可以要求用户联系我,根据需要添加更多,但是…)。而且,当用户创建一个新类别时,log_entries表不会有一列来表示新数据

如何管理动态数据库列?postgres hstore能处理这个问题吗


一行是根据日期属于用户的条目。每一列都包含特定于某一属性的数据(例如……一列可以标题为“草莓”,并包含当天售出的数量)

通常的方法是:

  • 商店
  • XML
  • JSON
见:

整个“使列可供其他用户使用”的工作只需要您保留一个“自定义键”表,每当用户定义以前未使用的键时,您就可以添加到该表中


使用动态DDL添加列一开始听起来很合理,但可以存储的列数和行的“宽度”是有限制的。当您添加更多列时,扫描表的性能会变得更差,尽管大多数为空的“稀疏”列相对便宜。添加列需要一个排他锁,这可能需要时间才能进入繁忙的系统,但如果列本身没有定义为
非空默认值…
,则添加列的速度非常快。一开始它会运行得很好,但我想你以后会后悔的。

通常的方法是:

  • 商店
  • XML
  • JSON
见:

整个“使列可供其他用户使用”的工作只需要您保留一个“自定义键”表,每当用户定义以前未使用的键时,您就可以添加到该表中


使用动态DDL添加列一开始听起来很合理,但可以存储的列数和行的“宽度”是有限制的。当您添加更多列时,扫描表的性能会变得更差,尽管大多数为空的“稀疏”列相对便宜。添加列需要一个排他锁,这可能需要时间才能进入繁忙的系统,但如果列本身没有定义为
非空默认值…
,则添加列的速度非常快。一开始它会运行得很好,但我想你以后会后悔的。

我最终没有使用hstore,因为我认为它不是最好的解决方案。这可能是……我只是不想浪费时间去摸索。我最终做的是改变我现有的偏好模型并创建一些新模型。在Preferences模型中,我有一个字符串列,在其中存储被引用模型的名称和该模型项id…然后在需要时固定字符串

因此,如果用户想要在他们的偏好中包括水果,他们可以单击“添加更多水果”,如果他们想要的特定水果没有列出,他们可以添加它。当他们保存他们的首选项时,选定的水果id将存储为整数,通过隐藏字段,引用的模型(在本例中为“水果”)将存储为字符串

然后,在用户偏好索引页面中,我有一个标题为“水果”的部分(如果用户有任何水果偏好)。查询只是在首选项表中搜索与当前用户匹配的用户,modelref匹配“Fruit”,并使用未关联的存储id查找Fruit记录


我可能没有很好地解释这一点……但是,也许它会帮助其他寻求做类似事情的人。

我最终没有使用hstore,因为我认为它不是最好的解决方案。这可能是……我只是不想浪费时间去摸索。我最终做的是改变我现有的偏好模型并创建一些新模型。在Preferences模型中,我有一个字符串列,在其中存储被引用模型的名称和该模型项id…然后在需要时固定字符串

因此,如果用户想要在他们的偏好中包括水果,他们可以单击“添加更多水果”,如果他们想要的特定水果没有列出,他们可以添加它。当他们保存他们的首选项时,选定的水果id将存储为整数,通过隐藏字段,引用的模型(在本例中为“水果”)将存储为字符串

然后,在用户偏好索引页面中,我有一个标题为“水果”的部分(如果用户有任何水果偏好)。查询只是在首选项表中搜索与当前用户匹配的用户,modelref匹配“Fruit”,并使用未关联的存储id查找Fruit记录


我可能没有很好地解释这一点……但是,也许这会帮助其他人做类似的事情。

hstore似乎是一个不错的选择。但是,如果一个用户创建了一个类别,那么我希望该类别可供所有用户使用。hstore似乎是针对特定用户的,可能不是很有组织性。这是我能来的最佳选择