我想初始化我的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
我回到零:(
为什么会出现这种情况? 有没有一种方法来完成我想完成什么?
我会建议使用一个常数这样的情况:
class Participant < ActiveRecord::Base
STATUSES = [
'exists',
'paired',
'quiz_finished',
'quiz_results_seen',
'money_sent'
]
如果你想从内部类访问数组,只是做STATUSES
,从外面类使用Participant::STATUSES
对我来说,最好的答案是创建一个类变量,而不是一个实例变量:
@@possible_statuses = [
'exists',
'paired',
'chat1_ready',
'chat1_complete'
]
然后,我可以自由访问它的类的方法:
def status=(new_status)
self.status_data = @@possible_statuses.index(new_status)
end
在你的榜样,@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
正如在其他的答案中提到,如果状态的该列表永远不会改变,你应该使用恒定的,而不是一个变量。
当您创建模型,因为它不被存储在数据库中的任何地方的实例变量才存在。 您将要使它成为一个常数按大雄的建议。 或者,你可以把它像一个模块...
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。 你会包括这个代码嵌套在模型中。