【发布时间】:2012-01-27 02:47:07
【问题描述】:
类变量是在 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
担心的是,通过在 ApplicationController before_filter 中将 current_club 设置为 Member 类变量,当有多个俱乐部同时访问应用程序时,是否可能存在冲突和竞争条件?
我们在开发环境中做了一些调试测试,发现在ApplicationController中进入before_filter方法时,模型中的@@current_club属性(Member.current_club)总是为nil。换句话说,没有证据表明 current_club 在为新请求提供服务时受到先前请求的影响。所以我认为我们没问题,并且从应用程序控制器设置模型类变量的范围仅限于用户会话。但在继续采用这种方法之前,我想确定一下。”
【问题讨论】:
标签: ruby-on-rails