我不确定Ruby如何使用ActiveRecord直接在模型代码中保存数据。如何将数据保存到模型本身的数据库中? 基本上,我的代码由于以下原因而进入竞争状态(Ruby / rails + ActiveRecord + Sidekiq): -我的模型执行以下操作:
def is_present?(data)
memory['properties'].include?(data)
def update_mem(data, size)
if size != 0 && memory['properties'].length == amount
memory['properties'].shift
memory['properties'].push(data)
它将检查是否存在特定值(is_present),如果内存中尚不存在特定值['properties'],则会将其添加。
“内存”实际上是表(MySQL)中的一列,一旦我用“ memory ['properties']。push(123)”向其中写入内容,我想立即保存它们。
我的问题是,如何防止这种奇怪的比赛状态? 我想做的是使用模型将数据直接保存在DB中。问题在于它似乎不起作用。
因此,要访问模型中的数据,我使用以下代码: memory ['property']。push(123) 要么 self.memory ['property']。push(123)
它们都引用数据库表中的内存列。
但是接下来我想做一些类似self.save的事情!但它根本不起作用。
我试图在模型自身中添加以下代码:
self.memory_will_change!
self.memory['properties'].push(property)
self.save!
不幸的是,它无法正常工作,我无法将数据保存到数据库中。
此模型实际上是通过使用Sidekiq的perform()进行调用的,如下所示:
model = Receivers.find(id)
model.receive(data)
model.time = Time.now
model.save!
因此,时间已正确更新,但内存(在我称之为“接收”时在模型中已更新)没有更新。有谁知道如何克服这个问题?我需要直接在模型中将数据保存到数据库中。
谢谢,我希望收到您的来信。
答案 0 :(得分:0)
一种解决方案是使用锁,以便一次只能有一个进程访问该表。处理完毕后,您将释放锁。
查看以下链接: https://api.rubyonrails.org/v5.1/classes/ActiveRecord/Locking/Pessimistic.html