2015-04-21 2 views
0

Примечание: Отношение: User имеет много Devices.Различные результаты запроса в основной и дочерней цепочке

Прежде чем вызывать метод ниже, в тесте Rspec я создаю пользователя с точно одним устройством.

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 и потоках? Почему запрос внутри порожденного потока не работает должным образом?

Спасибо за любой совет.

ответ

1

Rails дает разные потоки различных соединений (точнее, есть пул соединений с базой данных, и любой член пула дает только один поток за раз).

Я предполагаю, что вы используете какие-то транзакции вокруг своих спецификаций - либо встроенную поддержку для rspec-rails, либо через database_cleaner. Это означает, что созданные вами устройства находятся в незафиксированной транзакции, и по умолчанию это означает, что они не видны другим соединениям (прочитайте уровни изоляции транзакций, если вы хотите узнать об этом больше), в частности тот, который находится в нить, которую вы породили.

В качестве сторонних версий рельсов не проверять соединения, созданные в потоках автоматически - вам нужно сделать это самостоятельно. Метод with_connection - это простой способ сделать это.

Смежные вопросы