#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’.