注意:关系:User
有很多Devices
。
在调用下面的方法之前,在Rspec测试中我创建了一个只有1个设备的用户。
def perform_stuff_in_a_thread
user.devices.where(platform: 0) # <ActiveRecord::AssociationRelation [#<Device id: 286, user_id: 19009, token: "abcd123", platform: 0, created_at: "2015-04-21 19:55:35", updated_at: "2015-04-21 19:55:35">]>
Thread.new do
user.devices.where(platform: 0) # <ActiveRecord::AssociationRelation []>
end
end
ActiveRecord和线程是否缺少任何问题?为什么生成的线程内的查询不能按预期工作?
感谢您的任何建议。
答案 0 :(得分:1)
Rails为不同的线程提供不同的连接(确切地说,有一个数据库连接池,并且池的任何一个成员一次只能给一个线程。)
我假设您正在使用某些形式的事务来处理规范 - 无论是内置于rspec-rails的支持还是通过database_cleaner。这意味着您创建的设备位于未提交的事务中,默认情况下这意味着其他连接不可见(如果您想了解更多信息,请在事务隔离级别上读取),尤其是你产生的线程。
由于当前版本的rails不会自动检查线程中创建的连接 - 您需要自己执行此操作。 with_connection
方法是一种简单的方法。