1

У меня есть активный ресурс, похожий на модель, которая общается с остальным ресурсом. Путь к ресурсу имеет некоторые динамические параметры, поэтому я устанавливаю некоторые переменные класса в модели перед каждым запросом.Как избежать условий гонки при установке переменных класса при каждом запросе в Ruby on Rails

У меня есть что-то вроде этого:

class MyClass << MySuperClass::Base 

    class << self 
    attr_accessor :site 
    attr_accessor :shop_id 
    attr_accessor :product_id 

    def get 
     RestClient.get(self.site) 
    end 

    def set_site(shop_id, product_id) 
     self.site = "http://example.com/api/shop/#{shop_id}/product/#{product_id} 
    end 
    end 
end 

В мой контроллер приложения у меня есть перед фильтром, который устанавливает shop_id и PRODUCT_ID

class ApplicationController < ActionController::Base 
    before_filter :set_site 

    private 

    def set_site 
    MyClass.set_site(current_shop.id, current_product.id) 
    end 
end 

Как я понимаю здесь: http://m.onkey.org/thread-safety-for-your-rails Это может быть причиной некоторых условий гонки.

Эта статья была написана 3 года назад, так что все еще так, что установка переменных класса для запроса может привести к состоянию гонки?

И если да, то какова нынешняя лучшая практика для достижения аналогичного поведения без возникновения состояния гонки?

ответ

2

Ответ на этот вопрос question гласит: «стандартное приложение для рельсов однопоточное». Проверьте его для деталей.

0

Не устанавливайте переменные класса для классов, которые будут иметь разные значения для разных запросов.

Rails будет сохранять переменные класса между запросами, и вы не сможете гарантировать, что данные не будут протекать между двумя сеансами разных пользователей.