2012-01-27 24 views
0

類變量是在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在提供新請求時受到先前請求的影響。所以我認爲我們沒問題,並且從應用程序控制器設置模型類變量的範圍限定在用戶的會話中。不過,我想是之前使用這種方法走在前面肯定。」

回答

0

如果你有current_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 

你不必擔心競賽狀況,由於價值觀和所有廢話而引起的怪異。

+0

是的,這是可能的,但這正是我們試圖避免的方法:必須通過俱樂部進入每個更新操作的成員。這看起來很尷尬。 – 2012-01-27 03:07:22

+0

如果一個成員只屬於一個俱樂部,那將會很尷尬。但是,根據多個俱樂部的要求,您需要選擇一個特定的俱樂部。是的,類變量是另一種方式,但是你真的打開了一個受傷的世界。共享數據最終會咬你。 – 2012-01-27 03:09:45

+0

不是Rails應用程序單線程嗎?這將消除競爭條件的機會,否則將壓倒所有共享數據,不是嗎? – 2012-01-27 03:40:46

相關問題