Rails模型中的实例变量

时间:2012-06-28 21:10:12

标签: ruby-on-rails model instance-variables

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

我的回复是:(

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

4 个答案:

答案 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。您可以在模型中包含此代码。