在REST API的上下文中,我一直在使用DBIx :: Class来创建相关的行,即
POST /artist
{ "name":"Bob Marley", "cds":[{"title":"Exodus"}] }
最终调用创建Artist的$artist->new($data)->insert()
并在CD表中创建相关行。然后它将结果对象发送回用户(通过DBIC::ResultClass::HashRefInflator
),包括创建的主键和默认值。当用户对这些对象进行更改并再次将其发送回API时,就会出现问题:
POST /artist/7
{ "name":"Robert Nesta Marley", "artistid":"7",
"cds":[{"title":"Exodus", "cdid":"1", "artistid":"7", "year":"1977"}] }
现在怎样?从我在测试中可以看到,DBIC::Row::update
不处理相关行的更改,因此在这种情况下,名称更改将起作用,但CD年份的更新不会。 DBIC::ResultSet::update_or_create
只需致电DBIC::Row::update
。所以我去寻找一些替代品,它们似乎确实存在,即DBIC::ResultSet::RecursiveUpdate,但它在4年内没有更新,并且它的引用似乎表明它应该/将被折叠到DBIC中。那发生了吗?
我错过了一些容易的东西吗?
显然,我可以处理这种特殊情况,但是我有许多API可供编写,并且对于所有这些API来说更容易处理它。我当然很想使用RecursiveUpdate,但由于它明显被遗弃而保持警惕。
答案 0 :(得分:1)
Ribasushi承诺如果有人加强并将其测试套件迁移到DBIC架构并提出了一个理智的API,因为他不喜欢RU当前如何处理这个问题,那么它就会使RecursiveUpdate功能成为核心。 Catalyst :: Controller :: DBIC :: API几年来一直在生产中使用RU以及HTML :: Formhandler :: Model :: DBIC,没有任何问题。
所以目前RecursiveUpdate是要走的路。