Поток в консоли rails с активной записью не находит модель в базе данных - PullRequest
4 голосов
/ 16 января 2011

Я использую Rails 3 и Ruby 1.9.

Я использую 2 метода в различных тестах rails (и в консоли).Методы называются index_cases и index_new_cases, а тела методов показаны ниже.Содержимое метода index_new_cases, вероятно, не имеет значения (я индексирую информацию ModelCase, используя гем Sunspot), но я оставляю ее там для полноты.

У меня есть 3 case_numbers.Каждый case_number соответствует ModelCase в базе данных (т. Е. В БД 3 ModelCase записей).

Когда я использую эти 3 case_numbers для запуска тестов по методу index_cases,метод index_new_cases НЕ извлекает никаких случаев, используя метод ModelCase.where….Однако, если я уберу вызовы «threading» в методе index_cases, функция index_new_cases теперь извлекает все 3 случая и правильно их индексирует.

Может кто-нибудь объяснить мне, почему мои потоки не могут найтизаписи базы данных?Моя реализация потоков не так?Спасибо!

  def index_cases(case_numbers)
    threads = []
    case_numbers.each_slice(500) do |slice_of_case_numbers|
      threads << Thread.new(slice_of_case_numbers) do |a_slice|
        index_new_cases(a_slice)
      end
    end
    threads.each {|thr| thr.join}
  end

  def index_new_cases(case_numbers)
    cs = ModelCase.where(case_number: case_numbers).includes(:child_tables)
    puts cs.size # prints 0 with threading and 3 without threading
    Sunspot.index(cs)
    Sunspot.commit
  end

Этот метод (без многопоточности) работает правильно, чтобы найти и проиндексировать записи в моей базе данных

  def index_cases(case_numbers)
    #threads = []
    case_numbers.each_slice(500) do |slice_of_case_numbers|
      #threads << Thread.new(slice_of_case_numbers) do |a_slice|
        index_new_cases(slice_of_case_numbers)
     #end
    end
    #threads.each {|thr| thr.join}
  end

1 Ответ

4 голосов
/ 23 августа 2011

У меня была очень похожая проблема, но только в тестах.

Проблема заключается в транзакциях, которые используются в тестовых случаях (когда включены фиксации транзакций) - изменения данных не видны другим соединениямдо тех пор, пока транзакция не зафиксирована.

См. http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

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

Потоки должны иметь новое соединение с базой данных.А поскольку при использовании фиксаций транзакций весь тестовый прогон оборачивается транзакцией, все потоки внутри него не будут видны, кроме того, что они сами создают.

Вы можете отключить транзакции, к счастью, также дляодиночные тесты: http://ar.rubyonrails.org/classes/Fixtures.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...