2012-06-28 20 views
5

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

class Participant < ActiveRecord::Base 

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

    def statuses 
    @possible_statuses 
    end 

をしかし、私は、次の使用して、レールコンソールしようとしたときに:私は:(

nilを返されています

Participant.first.statuses 

をなぜこれが起こるん を達成する方法はありますか?

答えて

3

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

私はその後、自由にクラスのメソッドでアクセスできます

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

このクラス変数の値が一定になる場合は、これを参照してください。http://stackoverflow.com/questions/9396563/why-should-私たちは避けて使うクラス間変数 – Bot

10

このような場合には定数を使用することをお勧めします。

class Participant < ActiveRecord::Base 

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

あなただけSTATUSESを行い、そして、あなたの例では、外部のクラスを使用Participant::STATUSES

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 

他の回答で述べたように、ステータスのリストが変更されない場合、あなたは定数ではなく変数を使用する必要があります。

+0

私は2つのモデルを持っています:仕事と組織。組織にはたくさんのジョブがあり、組織にはジョブが属しています。組織は仕事を投稿し、私のアプリのどこにでも見えるように承認する必要があります。どちらも検索することができます(今までに見つかったものは承認する必要があります)。私がしたいのは、自分の仕事モデルに「組織が承認された仕事」という変数を持たせることです。だから、私は仕事のための検索方法を書いたときに、 "@ approved_jobs.where(" LIKE?とdescription LIKE? "、params [:search]、params [:search])のようなものを使うことができます。私が必要とする@approved_jobs変数を定義しますか?thx – Myna

+0

私はこの問題を解決するためにデータベースを使用します、ジョブテーブルに承認されたブールフィールドを追加してください - スコープを追加してください: "scope:approved、where(:approved => true)"。 –

+0

組織表に承認されたブール値があり、ジョブに対して承認されたブール値がありません。ジョブのブール値も設定している場合、どのようにして "組織承認された場合、そのすべての仕事も承認されなければならない。そして、その逆もあります。 – Myna

0

インスタンス変数は、モデルを作成するときにのみ存在します。これは、データベースに格納されていないためです。あなたはノビータの提案に従って一定にしたいと思うでしょう。また、あなたはIMO、...それモジュールのようなこれはあなたに少しより多くの制御と柔軟性を提供します

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 

を作ることができます。このコードをモデルに入れておきます。

私にとって最良の答えは、クラス変数ではなく、インスタンス変数を作成することでした
関連する問題