Являются ли переменные класса хорошим способом установки контекста для экземпляра класса в приложении Rails?
Мы создаем приложение rails, которое управляет членами клубов.Таким образом, существует модель члена и модель клуба.Поскольку член может принадлежать многим клубам, а клуб может иметь много членов, между ними существует ассоциация HABTM.
Наша трудность заключается в определении контекста клуба, в котором существует экземпляр члена.Например, чтобы установить статус членских взносов как «оплаченный», нам нужно знать, за какой клуб были уплачены членские взносы. Мы бы хотели, чтобы контроллер просто установил что-то вроде
@member.paid=true
без суеты.о том, чтобы не забывать устанавливать клуб каждый раз, когда мы обновляем члена.
Решение, которое мы придумали, устанавливает переменную класса в Member.
application_controller.rb
class ApplicationController < ActionController::Base
before_filter :set_current_club
def set_current_club
Member.current_club = current_club
end
...
end
В качестве несколько надуманного примера представьте, что в каждом клубе есть множество членов, которые заплатили свои взносы.Тогда мы получим.
member.rb
class Member < ActiveRecord::Base
cattr_accessor :current_club
...
def paid=(status)
if (status)
@@current_club.paid_members << self
else
@@current_club.paid_member.delete(self)
end
end
def paid?
@@current_club.paid_members.include?(self)
end
...
end
Проблема заключается в том, что, устанавливая current_club в качестве переменной класса Member в ApplicationController before_filter, возможно ли возникновение конфликтов и условий гонки при наличии более одного клубаодновременный доступ к приложению?
Мы провели некоторое отладочное тестирование в нашей среде разработки и показали, что атрибут @@ current_club в модели (Member.current_club) всегда был равен нулю при входе в метод before_filter вApplicationController.Другими словами, не было никаких доказательств того, что на current_club влияли предыдущие запросы при обработке нового запроса.Поэтому я думаю, что мы в порядке, и что установка переменной класса модели из Application Controller ограничена сессией пользователя.Но я хотел бы быть уверен, прежде чем идти дальше с этим подходом. "