如何在Datamapper中的UPDATE查询中添加WHERE子句

时间:2013-09-06 06:01:21

标签: mysql ruby multithreading datamapper ruby-datamapper

我有一个Datamapper模型,比如XYZ。现在,有多个线程有时会使用此模型读取一行并尝试更新同一行 - 根据XYZ的属性,只有一个应该成功,例如abc

class XYZ
include DataMapper::Resource
property :id # primary key
property :abc
end

现在:

obj = XYZ.get(some_id)
obj.update(abc: 10) # Assume abc column value was 5 earlier

这可能发生在多个线程中,并且可能同时发生。此外,列abc的新值在每个线程中都不同。一旦线程更新abc,其他人不应该。基本上我要做的是通过datamapper运行此查询:

UPDATE `xyz` SET `abc` = 20 WHERE `id` = <some id> AND `abc` = 5

model.update函数不允许更新属性并同时放置该属性的条件。我知道我可以直接运行SQL查询;但还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

我会做这样的事情:

XYZ.all( :id => some_id, :abc => 5 ).update( :abc => 20 )