Являются ли переменные класса хорошим способом установки контекста для экземпляра класса в приложении Rails? - PullRequest
0 голосов
/ 27 января 2012

Являются ли переменные класса хорошим способом установки контекста для экземпляра класса в приложении 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 ограничена сессией пользователя.Но я хотел бы быть уверен, прежде чем идти дальше с этим подходом. "

1 Ответ

0 голосов
/ 27 января 2012

Если у вас есть свойство current_club, которое, как я полагаю, является какой-то формой переменной сеанса, приведенный выше код абсолютно не нужен.

Чтобы получить запись Club члена, имеющую переменную current_clubпросто переберите все клубы, связанные с этим участником, найдите запись, соответствующую текущему клубу, и все готово.

Примерно так:

class Member < AR::Base
  def paid_for(club, status)
    if status
      club.paid_members << self
    else
      club.paid_members.delete(self)
    end
  end

Вам не нужнобеспокоиться о расовых условиях, странностях из-за ценностей, болтающихся вокруг, и всей этой хрени.

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