如何在不重新获取相关对象的情况下创建行?

时间:2017-02-07 14:42:36

标签: perl dbix-class

我有this guy的相反问题。

我有一个过去经常使用这种模式的应用程序:

$rs->create({ foo => 'bar',
              status => { label => 'Active' } });

在幕后DBIC将执行SELECT以确定是否需要创建相应的状态对象,或者是否存在标记为“Active”的状态对象。如果确实存在,则其ID将用作我正在创建的对象中FK的值。

问题是,状态表几乎永远不会改变,并且状态不是很多,因此99.99%的时间基本上是对数据库的浪费查询。我们考虑使用ENUM,但是应用程序的早期阶段,所以我们必须在最初的几周内弹出一些新的状态。 INSERT比*** ALTER TABLE status CHANGE label label ENUM(...)更少痛苦。将它们放在表格中意味着我们可以轻松地列出可能的值,以便UI构建下拉列表。

所以现在我们有一堆get_THING_id函数,它们采用THING标签并返回一个ID。 get_THING_id函数为memoized,我们这样做:

$rs->create({ foo => 'bar',
              status_id => get_status_id('Active') });

感觉不太像DBIC-y而且不得不将它们全部导入到那里。

我们应该咬紧牙关并使用ENUM吗?人们为这种小桌子做了什么?

1 个答案:

答案 0 :(得分:1)

我们在DBIC模式中有一个:: Constants类(包),它包含所有这些静态内容的常量。 因为如果这些表的内容发生变化,通常需要调整模式甚至应用程序逻辑,添加/更改常量不是问题。