我有一些代码描述了下面这个假设的设置。包含许多条形的类Foo。酒吧属于唯一一个Foo。在某些时候,Foo可以做一个有限循环,经过2次迭代。在该循环中,会发生类似以下情况:
bar = Bar.find_where_in_use_is_zero
bar.in_use = 1
基本上,就SQL而言,find_where_in_use_is_zero做了类似的事情:
SELECT * from bars WHERE in_use = 0
现在我面临的问题是,在调用bar.in_use = 1之后,我无法运行以下代码行:
bar.save
原因很清楚,我仍然在循环,并且还没有创建新的Foo,因此我们没有将foo_id放入bars.foo_id。即使我设置为允许foo_id为NULL,我们也会遇到一个问题,其中一个条可能会失败验证并且现有的条被保存到数据库中。在我的应用程序中,这不起作用。整个请求都是原子的,要么全部成功,要么一起失败。接下来会发生的是,在我的循环中,我有可能选择与之前循环迭代相同的精确条形,因为在调用@ foo.save之前,in_use标志不会设置为1。
是否仍然可以解决这个问题,并暂时将in_use属性设置为1,以便循环的后续迭代,以便检索可用的条形实例?
答案 0 :(得分:-1)
您可以使用null为foo_id
保存该栏或者,您可以使用bar id和in_use的值保持有效的散列吗?然后先检查哈希值,然后从bar对象检查。
如果无法将状态保存到db,则必须在db之外执行此操作。如果不知道项目的细节,没有人能告诉你如何做到这一点。