ActiveRecord在模型中自动保存

时间:2018-10-16 14:47:49

标签: ruby-on-rails ruby activerecord sidekiq

我不确定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'],则会将其添加。

  • 很显然,如果只有一个线程正在访问“内存”,那么它工作得很好,但是由于Sidekiq相当快,因此可能有多个线程在运行,并且最终会处于竞争状态(一个线程写东西,另一个线程读什么)。以前在内存中。)

“内存”实际上是表(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!

因此,时间已正确更新,但内存(在我称之为“接收”时在模型中已更新)没有更新。有谁知道如何克服这个问题?我需要直接在模型中将数据保存到数据库中。

谢谢,我希望收到您的来信。

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用锁,以便一次只能有一个进程访问该表。处理完毕后,您将释放锁。

查看以下链接: https://api.rubyonrails.org/v5.1/classes/ActiveRecord/Locking/Pessimistic.html