2012-06-28 108 views
5

我想要在我的Rails模型中初始化一個實例變量,它將容納一個數組,並且我想在我的模型中的其他方法中訪問這個變量。我嘗試這樣做:Rails模型中的實例變量

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def statuses 
    @possible_statuses 
    end 

但是,當我嘗試以下使用Rails控制檯:

Participant.first.statuses 

我無:(

返回爲什麼會發生這種情況 有沒有做到的方式?我正在嘗試完成什麼?

回答

3

對我來說,最好的答案是創建一個類變量,而不是一個實例變量:

@@possible_statuses = [ 
    'exists', 
    'paired', 
    'chat1_ready', 
    'chat1_complete' 
] 

然後我可以自由地訪問它的類的方法:

def status=(new_status) 
    self.status_data = @@possible_statuses.index(new_status) 
    end 
+1

如果此類變量的值將保持不變,那麼很好,否則請參閱http://stackoverflow.com/questions/9396563/why-should-使用類變量,我們避免的-式護欄 – Bot

10

我會推薦使用這種情況下的常量:

class Participant < ActiveRecord::Base 

    STATUSES = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

如果您要訪問從內部類陣列,只是做STATUSES,從外面類使用Participant::STATUSES

2

在你的榜樣,@possible_statuses是在類上,而不是每個實例變量物體。這裏是一個如何做到這一點相當詳細的例子:

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def self.possible_statuses 
    @possible_statuses 
    end 

    def possible_statuses 
    self.class.possible_statuses 
    end 

    def statuses 
    possible_statuses 
    end 

end 

正如在其他的答案中提到,如果狀態的該列表永遠不會改變,你應該使用恆定的,而不是一個變量。

+0

我有2種型號:工作和組織。一個組織擁有多個工作,而一個工作屬於一個組織。組織發佈工作,需要獲得批准才能在我的應用程序的任何地方看到。兩者都可以被搜索(永遠找不到,他們需要被批准)。我想要做的是在我的工作模式中有一個變量,即「組織已被批准的工作」。因此,當我爲作業編寫搜索方法時,可以使用「@ approved_jobs.where('title LIKE?'和'description LIKE'',params [:search],params [:search])。定義我需要的@approved_jobs變量?thx – Myna

+0

我將使用數據庫來解決這個問題。將一個批准的布爾型字段添加到作業表中,然後添加一個作用域 - 「scope:approved,where(:approved => true)」。然後你使用Job.approved而不是@approved_jobs – 2012-08-01 15:56:42

+0

組織表有一個批准的布爾值,並且我沒有批准的布爾值作業。如果我也爲作業設置了一個布爾值,我該怎麼說「如果一個組織已獲批准,其所有工作也必須獲得批准。反之亦然「使用關聯和模型? – Myna

0

只有在創建模型時,實例變量纔會存在,因爲它沒有存儲在任何地方的數據庫中。根據大雄的建議,你會想讓它成爲一個常量。或者,你可以把一個模塊像...

module Status 
    EXISTS = "exists" 
    PAIRED = "paired" 
    QUIZ_FINISHED = "quiz_finished" 
    QUIZ_RESULTS_SEEN = "quiz_results_seen" 
    MONEY_SENT = "money_sent" 

    def self.all 
    [EXISTS, PAIRED, QUIZ_FINISHED, QUIZ_RESULTS_SEEN, MONEY_SENT] 
    end 
end 

這給你更多的控制和靈活性,IMO。你會包含嵌套在你的模型中的這段代碼。