@user = User.new(params[:user])
@student.user = @user
@student.save
if @user.save
...rest of the code
在我的应用中,学生有一个用户,每个用户都属于学生(将用户视为一个帐户)。该协会本身不是我的问题;是保存与学生相关联的新用户的最佳方法之上的代码块吗?
答案 0 :(得分:4)
我很惊讶没有人提到正确的方法。
@user = @student.build_user(params[:user])
if @user.save
# ... rest of the code ...
end
这样@user将与@student建立关联。
答案 1 :(得分:1)
如果用户和学生之间的对应关系是1:1,则这种关系可能是多余的。 (也许我错过了什么)。
更酷的方法是执行用户对象所需的所有操作,然后最后一个操作是:
@student.user = @user
@student.save
答案 2 :(得分:0)
我认为你有@
- 超载。如果要使变量成为类的实例变量,而不是仅存在于函数内的局部变量,则仅使用@
。无论如何,这是一种可行的方法:
@student.user = User.create(params[:user])
@student.save
if @student.user.new_record?
# didn't get saved...
end
ActiveRecord::Base#create
创建一个新对象,尝试将其保存到数据库,然后返回该对象,并且是新保存模式的有用快捷方式。但它始终返回对象,因此您需要询问它是否已成功保存,因此new_record?
。
答案 3 :(得分:0)
如果学生has_one用户,则应将外键放在用户上。如同,用户将在数据库中具有student_id
列。学生的user_id
列不是必需的。
在这种情况下你可以这样做:
@user = User.new(params[:user])
@user.student = @student
if @user.save
...rest of the code
您甚至不需要修改@student
。
答案 4 :(得分:0)
我想到的问题是,学生和用户之间的关系是一个有一个关系还是一个关系。它与域问题的对象建模有关。
我怀疑它可能是-a,在这种情况下你不想要has_one和belongs_to - 称为“组合” - 而是单表继承(STI) - 称为“继承”。 / p>
要问的问题是: 1.学生是否也是用户,即学生与用户具有相同的属性和方法,还有更多的方法或限制?由于在这种情况下学生IS也是用户,因此学生是否可以拥有0个,1个或更多用户的问题不适用。 2.学生是否“拥有”一个用户,因为它也可能有0个用户,或者可能超过1个用户?