我现在正在寻找解决当前问题的最佳方法:我有两个模型:产品和照片。照片通过 has_many 与产品关联。 当用户创建新产品时,她还可以在将实际产品保存到数据库之前使用嵌套表单(Carrierwave、jquery)添加照片。由于该产品尚不存在,我正在寻找以正确的关联将照片保存到数据库的最佳方法。
我想到了几种方法:
1) 当用户点击“新产品”时,我会立即将产品保存到数据库中,并使用正确的 ID,然后在用户点击“取消”时再次将其删除。这样我就必须对我的验证进行一些困惑,并进行一些客户端验证。 如果用户在产品创建期间关闭浏览器窗口,则可能会出现问题 - 产品将保留在数据库中。
2) 我将它保存到数据库并以某种方式标记它,使用奇怪的 ID 或 is_temp 字段或类似的东西。这样我就可以在用户每次登录时清理数据库in.“Cance”会立即删除该内容(以及所有相关照片)。
3) 在内存中创建临时 ID,但暂不保存产品。我可以保存与此临时 ID 相关联的照片,当用户点击“最后保存”时,我将 Product_id 更改为新的真实产品 ID
到目前为止,对我来说,解决方案 2 看起来是最好、最干净的方法,这有点类似于 Ryan Bates 的 Guest Record Railscast,但也许我在这里遗漏了一些东西,而且还有一种更简单的方法。 任何其他解决方案都受到高度赞赏。
非常感谢!
最佳答案
使用#1,因为它更强大。特别是,它对于 API 来说更加有效。
这会让您养成构建模型的习惯,以便可以以独立的方式保存和修改它们。例如,用户可能确实想要没有照片的产品。
我的现实世界应用程序正是这样的设置。当用户尝试使用未正确上传的照片创建产品时,该产品仍会正确保存、正确验证等。
此外,该应用还有一个 API,可以调用创建产品,然后再调用添加照片。对于 API 客户端来说,能够独立于所有关联照片创建产品非常有用。
避免#2,因为它会使产品滞留在数据库中。更糟糕的是,该产品尚未经过验证。这往往会给应用程序的其他区域(例如报告)带来问题,除非您强制每个报告查询过滤掉搁浅的记录。
仅当您希望在事务中使用它和/或在这种情况下需要最快的速度时,才考虑#3。首先在内存中完成所有操作确实有助于确保事务拥有所需的所有部分,并且确实节省了数据库访问。
关于jquery - 最佳实践 : Temporary Record with has_many association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14198866/