У меня есть несколько игроков, и игроки имеют состояние торговли. Вместо того, чтобы жестко кодировать торговые состояния, такие как «активный» и «неактивный», а затем нужно искать строки, я подумал, что был бы умен и имел бы отдельную модель TradeState, чтобы у игрока был trade_state_id (игрок может быть только в одно состояние торговли за раз).
Теперь было бы удобно иметь возможность получить всех активных игроков, используя именованные области, а затем произнеся «Player.active». Для этого мне нужно получить идентификатор записей TradeState, который соответствует 'active', поэтому я придумал это в классе Player:
named_scope :active, :conditions => {:trade_state_id => TradeState.active.first.id}
Это работает как брелок при тестировании в скрипте / консоли, но не работает, когда я иду на тестирование. Я использую RSpec, но подозреваю, что это не уместно. Когда я запускаю самый простой тест, я получаю следующую ошибку:
"Называется id для nil, который по ошибке будет 4"
Насколько я могу судить, среда тестирования загружает и анализирует модели в алфавитном порядке. Фреймворк анализирует вызов named_scope в модели Player и покорно ищет идентификатор первой активной записи TradeState. Однако эта модель еще не обработана и не готова, поэтому возникает ошибка получения идентификатора nil.
Сначала я подумал, что это потому, что в таблице trade_states может не быть никаких записей, поэтому я создаю и сохраняю trade_states, которые мне нужны, в блоке before (: each), но это не сработало. Тогда я сделал несколько приборов и попытался загрузить их, но это не сработало.
Это кажется правдоподобным? Есть ли другие объяснения? Как насчет обходных путей? Я мог бы попробовать издеваться над объектом TradeState, и я попробую.
Большое спасибо за ваше время.