我想在我的Rails模型中初始化一个包含数组的实例变量,我想在我的模型中的其他方法中访问这个变量。我试过这个:
class Participant < ActiveRecord::Base
@possible_statuses = [
'exists',
'paired',
'quiz_finished',
'quiz_results_seen',
'money_sent'
]
def statuses
@possible_statuses
end
但是当我使用rails console尝试以下操作时:
Participant.first.statuses
我的回复是:(
为什么会这样? 有没有办法完成我想要完成的任务?
答案 0 :(得分:10)
我建议在这种情况下使用常量:
class Participant < ActiveRecord::Base
STATUSES = [
'exists',
'paired',
'quiz_finished',
'quiz_results_seen',
'money_sent'
]
如果要从内部类访问该数组,只需执行STATUSES
,并从外部类使用Participant::STATUSES
答案 1 :(得分:3)
对我来说,最好的答案是创建一个类变量,而不是实例变量:
@@possible_statuses = [
'exists',
'paired',
'chat1_ready',
'chat1_complete'
]
然后我可以在类的方法中自由访问它:
def status=(new_status)
self.status_data = @@possible_statuses.index(new_status)
end
答案 2 :(得分:2)
在您的示例中,@ asposible_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
如其他答案中所述,如果状态列表永远不会改变,则应使用常量而不是变量。
答案 3 :(得分:0)
实例变量仅在您创建模型时存在,因为它不会存储在任何地方的数据库中。根据Nobita的建议,你会想让它成为一个常数。或者,你可以把它变成像......的模块。
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。您可以在模型中包含此代码。