ruby-on-rails – 使用活动记录在rails控制台中进行线程处理时,
我正在使用Rails 3和
Ruby 1.9.
我在各种rails测试中(以及在控制台中)运行了2种方法.这些方法称为index_cases和index_new_cases,方法体如下所示. index_new_cases方法的内容可能不相关(我使用Sunspot gem索引ModelCase信息),但为了完整性我将其留在那里. 我有3个case_numbers.每个case_number都匹配数据库中的ModelCase(即db中有3个ModelCase记录). 当我使用这3个case_numbers在index_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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |