Есть ли более элегантный способ сделать это в Rails (ассоциация has_one) - PullRequest
0 голосов
/ 09 июля 2010

Эй, я очень новичок в Ruby и Rails.Мне было интересно, правильно ли я это делал.

@user = User.new(params[:user])
@student.user = @user
@student.save
if @user.save
  ...rest of the code

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

Ответы [ 5 ]

4 голосов
/ 09 июля 2010

Я удивлен, что никто не упомянул правильный путь.

@user = @student.build_user(params[:user])

if @user.save
   # ... rest of the code ...
end

Таким образом, @user будет уже связан с @ student.

1 голос
/ 09 июля 2010

Если переписка между пользователем и учеником составляет 1: 1, возможно, эта связь является избыточной. (может быть, я что-то упускаю).

Более холодный подход будет заключаться в выполнении всех необходимых вам операций с пользовательским объектом, и тогда последним будет:

@student.user = @user
@student.save
0 голосов
/ 22 февраля 2011

Вопрос, который встает передо мной, заключается в том, являются ли отношения между Студентом и Пользователем отношениями «есть» или «есть». Это связано с объектным моделированием проблемы предметной области.

Я подозреваю, что это может быть is-a, и в этом случае вам не нужны has_one и assign_to - известные как "состав" - но вместо этого наследование одной таблицы (STI) - известные как "наследование". 1003 *

Вопросы, которые нужно задать: 1. Является ли ученик также пользователем, т. Е. Имеет ли ученик те же атрибуты и методы, что и пользователь, плюс дополнительные методы или ограничения? Поскольку в этом случае ученик также является пользователем, вопрос о том, может ли ученик иметь 0, 1 или более пользователей, не применяется. 2. Есть ли у Ученика «Пользователь» в том смысле, что у него также может быть 0 Пользователей или, возможно, более 1?

0 голосов
/ 09 июля 2010

Если у ученика есть Пользователь, то вы должны поставить внешний ключ на Пользователя.Например, у пользователя будет столбец student_id в базе данных.Столбец user_id на Студенте не нужен.

В этом случае вы можете просто сделать это:

@user = User.new(params[:user])
@user.student = @student
if @user.save
  ...rest of the code

И вам даже не нужно будет изменять @student.

0 голосов
/ 09 июля 2010

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

@student.user = User.create(params[:user])
@student.save

if @student.user.new_record?
  # didn't get saved...
end

ActiveRecord::Base#create создает новый объект, пытается сохранить его в базе данных, а затем возвращает объект, и является полезным ярлыком для новогосохранить шаблон.Тем не менее, он всегда возвращает объект, поэтому вам нужно спросить, было ли оно успешно сохранено, следовательно, new_record?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...