具有活动记录的rails控制台中的线程在数据库中找不到Model

我正在使用Rails 3和Ruby 1.9。

我在各种rails测试中(以及在控制台中)运行了2种方法。 这些方法称为index_casesindex_new_cases ,方法体如下所示。 index_new_cases方法的内容可能不相关(我使用Sunspot gem索引ModelCase信息),但为了完整性我将其保留在那里。

我有3个case_numbers 。 每个case_number匹配数据库中的ModelCase (即db中有3个ModelCase记录)。

当我使用这3个case_numbersindex_cases方法运行测试时, index_new_cases方法不会使用ModelCase.where…方法检索任何情况。 但是,如果我删除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 

我有一个非常类似的问题,但只是在测试中。

问题在于测试用例中使用的事务(当事务处理装置打开时) – 只要事务未提交,对其他连接的数据更改就不可见。

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

因此,在操作完成之前,不会在连接之外看到对数据库的更改。

线程应该与数据库建立新连接。 而且由于在使用事务性装置时,整个测试运行都包含在一个事务中,除了它们自己创建的内容之外,线程中的任何内容都不可见。

您可以关闭交易,幸运的是还可以进行单项测试: http : //ar.rubyonrails.org/classes/Fixtures.html