類變量是在Rails應用程序中爲類實例設置上下文的好方法嗎?類變量是在Rails應用程序中爲類實例設置上下文的好方法嗎?
我們正在構建一個管理俱樂部成員的rails應用程序。因此有一個會員模型和一個俱樂部模型。由於會員可以屬於許多俱樂部,並且俱樂部可以有許多會員,他們之間有HABTM聯繫。
我們遇到的困難是確定成員實例存在的俱樂部上下文。例如,要設置一個成員會費狀態爲「有償」,我們需要知道哪些俱樂部會費已經paid.We想控制器只需設置類似
@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作爲在ApplicationController中的before_filter成員類變量,是有可能,有可能是具有多於一個俱樂部訪問在同一時間的應用程序時的衝突和競爭條件?
我們在我們的開發環境中進行了一些調試測試,發現在ApplicationController中輸入before_filter方法時,模型中的@@ current_club屬性(Member.current_club)始終爲零。換句話說,沒有證據表明current_club在提供新請求時受到先前請求的影響。所以我認爲我們沒問題,並且從應用程序控制器設置模型類變量的範圍限定在用戶的會話中。不過,我想是之前使用這種方法走在前面肯定。」
是的,這是可能的,但這正是我們試圖避免的方法:必須通過俱樂部進入每個更新操作的成員。這看起來很尷尬。 – 2012-01-27 03:07:22
如果一個成員只屬於一個俱樂部,那將會很尷尬。但是,根據多個俱樂部的要求,您需要選擇一個特定的俱樂部。是的,類變量是另一種方式,但是你真的打開了一個受傷的世界。共享數據最終會咬你。 – 2012-01-27 03:09:45
不是Rails應用程序單線程嗎?這將消除競爭條件的機會,否則將壓倒所有共享數據,不是嗎? – 2012-01-27 03:40:46