5

配列を保持するRailsモデル内のインスタンス変数を初期化し、モデル内の他のメソッドでこの変数にアクセスしたいと思います。私はこれを試しました:

class Participant < ActiveRecord::Base

  @possible_statuses = [
    'exists',
    'paired',
    'quiz_finished',
    'quiz_results_seen',
    'money_sent'
  ]

  def statuses
    @possible_statuses
  end

しかし、レールコンソールを使用して次のことを試したとき:

 Participant.first.statuses

私はnilが返されます:(

なぜこれが起こるのですか?私が達成しようとしていることを達成する方法はありますか?

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 に答える