2

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

我想到了几个方法:

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

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

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

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

非常感谢!

4

1 回答 1

2

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

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

我的真实应用程序正是这种设置。当用户尝试使用未正确上传的照片创建产品时,产品仍会正确保存、正确验证等。

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

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

仅当您希望它在事务中和/或在这种情况下需要最快速度时才考虑#3。首先在内存中完成这一切确实有助于确保事务具有它需要的所有部分,并且确实节省了访问数据库的时间。

于 2013-01-07T15:38:17.240 回答