在Rails的模型实例变量(Instance Variables in Rails Model)

2019-07-30 04:05发布

我想初始化我的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

我回到零:(

为什么会出现这种情况? 有没有一种方法来完成我想完成什么?

Answer 1:

我会建议使用一个常数这样的情况:

class Participant < ActiveRecord::Base

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

如果你想从内部类访问数组,只是做STATUSES ,从外面类使用Participant::STATUSES



Answer 2:

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

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

然后,我可以自由访问它的类的方法:

  def status=(new_status)
    self.status_data = @@possible_statuses.index(new_status)
  end


Answer 3:

在你的榜样,@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

正如在其他的答案中提到,如果状态的该列表永远不会改变,你应该使用恒定的,而不是一个变量。



Answer 4:

当您创建模型,因为它不被存储在数据库中的任何地方的实例变量才存在。 您将要使它成为一个常数按大雄的建议。 或者,你可以把它像一个模块...

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。 你会包括这个代码嵌套在模型中。



文章来源: Instance Variables in Rails Model