5

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

我返回零:(

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

4

4 回答 4

13

对于这种情况,我建议使用常量:

class Participant < ActiveRecord::Base

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

如果您想从内部类访问该数组,只需执行STATUSES,并从外部类使用Participant::STATUSES

于 2012-06-28T21:12:44.113 回答
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

如其他答案中所述,如果该状态列表从未更改,则应使用常量而不是变量。

于 2012-06-28T21:52:50.183 回答
2

对我来说最好的答案是创建一个类变量,而不是实例变量:

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

然后我可以在类的方法中自由地访问它:

  def status=(new_status)
    self.status_data = @@possible_statuses.index(new_status)
  end
于 2013-05-17T19:16:54.647 回答
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。您将包含嵌套在模型中的代码。

于 2012-06-28T21:53:59.650 回答