Rails模型中的实例变量

我想在我的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 

我回来了nil 🙁

为什么会这样? 有没有办法完成我想要完成的任务?

我建议在这种情况下使用常量:

 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 

在您的示例中,@ 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 

正如其他答案中所提到的,如果状态列表永远不会改变,则应使用常量而不是变量。

实例变量仅在创建模型时存在,因为它不存储在任何地方的数据库中。 根据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。 您将包含嵌套在模型中的此代码。