I'm using Rails 3 and Ruby 1.9.
I'm running 2 methods in various rails tests (and in the console). The methods are called index_cases
and index_new_cases
and the method bodies are shown below. The contents of the index_new_cases
method probably aren't relevant (I'm indexing ModelCase information using the Sunspot gem), but I leave it there for completeness.
I have 3 case_numbers
. Each case_number
matches a ModelCase
in the database (i.e. there are 3 ModelCase
records in the db).
When I use those 3 case_numbers
to run tests on the index_cases
method, the index_new_cases
method does NOT retrieve any cases using the ModelCase.where…
method. However, if i remove the "threading" calls in the index_cases
method, the index_new_cases
function now retrieves all 3 cases and indexes them properly.
Can anyone explain to me why my threads can't find the database records? Is my threading implementation wrong? Thanks!
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
This method (without threading) works properly to find and index my database records
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