ActiveRecord Автосохранение в модели - PullRequest
0 голосов
/ 16 октября 2018

Я не уверен, как 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)", я хотел бы сохранить их немедленно.

У меня вопрос, как мне это сделать?предотвратить это странное состояние гонки?Что я хотел бы сделать, это сохранить данные непосредственно в БД с использованием модели.Проблема в том, что он, кажется, не работает.

Итак, для доступа к данным в модели я использую следующий код: memory ['property']. Push (123) или self.memory ['property'] .push (123)

Они оба ссылаются на столбец памяти в таблице БД.

Но тогда я хочу сделать что-то вроде self.save!но он вообще не работает.

Я попытался добавить следующий код в саму модель:

self.memory_will_change!
self.memory['properties'].push(property)
self.save!

К сожалению, он не работает, и я не могу сохранить данные в БД.

Эта модель на самом деле вызывается через execute () с использованием Sidekiq, как показано ниже:

model = Receivers.find(id)
model.receive(data)
model.time = Time.now
model.save!

Таким образом, время обновляется правильно, но память (которая обновляется в модели при вызове"получить") не обновляется.Кто-нибудь знает, как преодолеть эту проблему?Мне нужно сохранить данные в БД непосредственно в модели.

Спасибо, и я с нетерпением жду вашего ответа.

1 Ответ

0 голосов
/ 16 октября 2018

Одним из решений было бы использование блокировки, чтобы только один процесс мог одновременно получить доступ к таблице.Как только вы закончите обработку, вы снимите блокировку.

Проверьте следующую ссылку: https://api.rubyonrails.org/v5.1/classes/ActiveRecord/Locking/Pessimistic.html

...