ActiveRecord: неверный подсчет после сохранения данных в новом потоке

#ruby-on-rails #multithreading #activerecord

#ruby-on-rails #многопоточность #activerecord

Вопрос:

У меня есть приложение Rails, которое делает что-то вроде этого (это упрощено для этого примера):

 count = MyModel.count
t = Thread.new do
  m = MyModel.new
  // set data on m
  m.save
end
t.join
new_count = MyModel.count
  

Хотя новая запись создается, new_count она всегда совпадает с count . Если я проверю его внутри потока, после сохранения он будет правильным (count 1).

В чем проблема? Как я могу получить правильный итог после выхода из потока?


Редактировать: я заставил его работать, установив для параметра Rspec config.use_transactional_fixtures значение false.

Ответ №1:

Попробуйте

 new_count = MyModel.uncached{ MyModel.count}
  

Комментарии:

1. Спасибо, но это не сработало. Я также пробовал ActiveRecord::Base.connection.clear_query_cache и ActiveRecord::Base.connection.disable_query_cache! , как предлагалось на других сайтах, но все еще ничего.

2. Когда я попробовал ваш код, я не столкнулся с проблемой. Я подозреваю, что ваше сохранение должно быть неудачным. Добавьте инструкцию log внутри потока после сохранения, чтобы проверить статус сохранения (например: добавить puts m.errors.to_xml после m.save )

3. Неважно, я заставил его работать, установив для RSpec config.use_transactional_fixtures значение false.

Ответ №2:

Я заставил его работать, установив для параметра Rspec config.use_transactional_fixtures значение false в файле ‘spec_helper.rb’.