Как избежать условий гонки при установке переменных класса для каждого запроса в Ruby on Rails - PullRequest
1 голос
/ 29 февраля 2012

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

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

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

В моем контроллере приложения у меня есть фильтр before, который устанавливает 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 ]

2 голосов
/ 29 февраля 2012

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

0 голосов
/ 29 февраля 2012

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

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

...