最佳实践:具有has_many关联的临时记录

时间:2013-01-07 15:27:25

标签: jquery ruby-on-rails ruby carrierwave

我现在正在寻找解决当前问题的最佳方法:我有两个模型,产品照片。照片通过has_many与产品相关联。 当用户创建新产品时,她还可以在将实际产品保存到数据库之前使用嵌套表单(carrierwave,jquery)添加照片。由于该产品尚不存在,我正在寻找以正确的关联方式将照片保存到数据库的最佳方式。

我想到了几种方式:

1)当用户使用正确的ID点击“新产品”时,我立即将产品保存到数据库中,如果用户点击“取消”,我会在之后再次将其删除。这样我就不得不在我的验证中乱七八糟地做一些客户端验证。 如果用户在创建产品期间关闭浏览器窗口,则可能会出现问题 - 产品将保留在数据库中。

2)我将它保存到数据库并以某种方式标记它,使用奇怪的ID或is_temp字段或类似的东西..这样我每次用户登录时都可以清理数据库in。“Cance”立即删除该东西(以及所有相关照片)。

3)在内存中创建临时ID,但尚未保存产品。我可以保存与此临时ID关联的照片,当用户点击最终保存时,我将product_id更改为新的真实产品ID

到目前为止,对我来说,解决方案2看起来是最好和最干净的方式,这有点类似于Ryan Bates的访客记录Railscast,但也许我在这里遗漏了一些东西,并且有一种更简单的方法。 任何其他解决方案都受到高度赞赏。

非常感谢你!

1 个答案:

答案 0 :(得分:2)

使用#1因为它更强大。特别是,它对API更有效。

这使您习惯于构建模型,以便以独立的方式保存和修改它们。例如,用户可能真的想要没有照片的产品。

我的真实应用程序正是这个设置。当用户尝试使用无法正确上传的照片创建产品时,产品仍然保存正确,经过正确验证等。

此外,该应用程序有一个API,可以调用创建产品,然后再调用另一个添加照片的API。 API客户端能够独立于所有相关照片创建产品,这非常有用。

避免使用#2,因为它会将产品搁置在数据库中。更糟糕的是,该产品尚未经过验证。这往往会导致应用程序的其他区域出现问题,例如报告,除非您强制每个报告查询过滤掉搁浅的记录。

只有在交易中需要它时才考虑#3和/或在这种情况下需要最快的速度。首先在内存中完成所有操作有助于确保事务具有所需的所有部分,并且可以保存到数据库的行程。

相关问题