2012-06-28 3 views
5

Я хочу инициализировать переменную экземпляра в моей модели Rails, которая будет содержать массив, и я хочу получить доступ к этой переменной в других методах моей модели. Я попытался это:Переменные экземпляра в Rails Model

class Participant < ActiveRecord::Base 

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

    def statuses 
    @possible_statuses 
    end 

Но когда я попытался с помощью следующих Рельсы консоли:

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 модели : Работа и организация. Организация has_many заданий, и работа принадлежит организации. Организации, занимающие должности, должны быть одобрены для просмотра в любом месте моего приложения. Оба могут быть найдены (чтобы их можно было найти, они должны быть одобрены). Я хочу, чтобы в моей модели работы была переменная, которая является «заданием, чья организация была одобрена». Так что, когда я пишу метод поиска для заданий, у меня может быть что-то вроде «@ approved_jobs.where (« title LIKE? And description LIKE? », Params [: search], params [: search]). Где и как бы вы определить переменную @approved_jobs мне нужно? thx – Myna

+0

Я бы использовал базу данных для решения этой проблемы. Добавьте одобренное логическое поле в таблицу заданий. Затем добавьте область действия - «scope: approved», где (: approved => true) ». Затем вы используете Job.approved вместо @approved_jobs. –

+0

В таблице организации есть утвержденное логическое значение, и у меня нет утвержденных логических для Джобса. Если я настроил логическое значение для заданий, как я могу сказать «если организация , все его рабочие места также должны быть одобрены. И наоборот: «используя ассоциации и модели?» – Myna

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 

Это дает вам немного больше контроля и гибкости, ИМО. Вы включили бы этот код, вложенный в вашу модель.

Смежные вопросы