Rails - как закодировать 'может принадлежать?

Я работаю над приложением Rails, которое будет содержать информацию о группе людей. Существует два варианта использования:

  • Администратор вводит и ведет профиль пользователя
  • Человек может решить зарегистрироваться, войти в систему и сохранить свой профиль

Я пытаюсь разобраться в отношениях между профилем и пользователем. Прямо сейчас, это profile belongs_to :user и user has_one :profile.

Но это ломается, потому что у некоторых профилей еще нет пользователя - они поддерживаются администратором. В этом случае столбец user_id в profiles равен null, соединение не выполняется, и страница не загружается. ++

Как я могу настроить отношения "возможно, принадлежит"?

++ (На самом деле он выглядит пустым, без ошибки отображается, и development.log также не имеет никаких ошибок, но я вижу, что он не заканчивает все запросы, которые он выполняет для профиля, который имеет Если кто-нибудь знает, как я могу получить полезное сообщение об ошибке, это также будет здорово.)

2 ответа

Это правильный способ сделать это. belongs_to не мешает значениям null, и это похоже на то, что вы хотите.

"Страница" для профиля, который еще не принадлежит пользователю, может не иметь столько запросов, потому что нет необходимости (или пути) запрашивать таблицу пользователей для этого профиля.

Вы должны проверить profile.user на nil и соответственно представить свои представления.


Если a Profile действительно принадлежит a User, тогда он никогда не должен быть нулевым (так же, как это не имеет смысла рассматривать Engine без привязанного к нему Car). Поэтому вам нужно удалить ассоциацию Profile.belongs_to :user.

Теперь вы сможете свободно редактировать Profiles и просто присоединять их к User, когда они будут готовы. Но у вас есть еще одна проблема:

Человек может решить зарегистрироваться, войти в систему и сохранить свой профиль

Как система надежно идентифицирует, какой предварительно созданный профиль принадлежит определенному пользователю, у которого еще нет профиля? Это проблема дизайна, которую вам придется разобраться.

licensed under cc by-sa 3.0 with attribution.