В модульном тесте Rails, как я могу получить прибор пользователя для загрузки соответствующего профиля? - PullRequest
9 голосов
/ 25 марта 2010

В документации, касающейся приборов (http://api.rubyonrails.org/classes/Fixtures.html)) приведен следующий пример использования ссылок на метки для ассоциаций:

### in pirates.yml
reginald:
  name: Reginald the Pirate
  monkey: george

### in monkeys.yml
george:
  name: George the Monkey
  pirate: reginald

Итак, следуя их указаниям, у меня есть модель User, которая имеет профиль__:модель Profile, которая принадлежит_пользователю и пыталась настроить приборы в соответствии с их примером:

### in users.yml
reginald:
  id: 1
  login: reginald

### in profiles.yml
reginalds_profile:
  id: 1
  name: Reginald the Pirate
  user: reginald

(Примечание: поскольку моя ассоциация односторонняя, у пользовательского прибора нет профиля ":«reginalds_profile» - установка этого параметра приводит к ошибке, поскольку таблица SQL не имеет атрибута profile_id.)

Проблема в том, что в моих модульных тестах все загружается правильно, но пользователи (: reginald) .profileвсегда ноль. Что мне не хватает?

Ответы [ 2 ]

19 голосов
/ 26 марта 2010

По предложению Тадмана я провел еще несколько поисков и нашел ответ в другом месте на этом сайте, так что я мог бы также опубликовать его.

См. Пост под названием Автоматические ассоциации в ruby ​​на рельсовых приспособлениях

Очевидно, что Rails находит связанные приборы, когда вы используете метки (user: reginald) вместо идентификаторов (user_id: 1), заключается в хешировании имени и предположении, что хэш является идентификатором. Если вы установите идентификатор для чего-то определенного, это не удастся. Но если вы позволите Rails автоматически назначать идентификаторы, он использует эту схему хеширования. Таким образом, в документации для меток ассоциации приборов отсутствует ключевой тезис - если вы используете метки, вы должны избегать применения ваших собственных идентификаторов в сопоставлениях приборов. Светильники, не соответствующие меткам, могут иметь любую выбранную вами схему идентификации.

3 голосов
/ 25 марта 2010

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

fixtures :all

Фактически объявляя каждый из них:

fixtures :users, :profiles
...