2010-07-09 60 views
0

嘿,我很新的Ruby和Rails。我想知道我是否以正确的方式做到这一点。有没有一种更优雅的方式来做到这一点在Rails(has_one协会)

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

在我的应用程序中,学生有一个用户,并且每个用户都属于学生(将用户视为帐户)。协会本身不是我的问题,是保存与学生关联的新用户的最佳方式之上的代码块?

回答

0

如果学生有一个用户,那么你应该把外键放在用户上。如在中,用户将在数据库中具有student_id列。学生的user_id栏不是必需的。

在这种情况下,你可以这样做:

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

而且你甚至不会需要修改@student

1

如果用户与学生之间的对应关系为1:1,可能是这种关系是多余的。 (也许我错过了一些东西)。

冷却器的做法将被执行,你需要将用户对象的所有操作,然后最后一个是:

@student.user = @user 
@student.save 
+0

是的,这是一对一的对应......你是说我不需要定义has_one和belongs_to的关系吗?我如何从用户那里引用学生,反之亦然?道歉,我觉得我不完全了解这些关系对我有何帮助。 – Carlo 2010-07-09 16:04:54

+0

不同意评论。无论是否1:1,有两个模型之间的关系仍然是有用的。是的,你仍然需要在其中定义'has_one','belongs_to'。 – 2010-07-09 16:56:10

0

我认为你有@ - 过载这里。如果要将变量设置为类的实例变量,而不是只存在于函数内部的局部变量,则仅使用@。总之,这里的一个可能的方式做到这一点:

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

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

ActiveRecord::Base#create创建一个新对象,尝试将其保存到数据库,然后返回的对象,是为新的保存方式有用的快捷方式。但它始终返回对象,因此您需要询问它是否成功保存,因此new_record?

4

我很惊讶没有人提到正确的方法。

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

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

这样@user将被建立已经与@student关联。

+0

啊,是的。我怀疑有一个“更正确”的方法来做到这一点。 – 2010-07-09 18:14:21

0

对我而言,问题在于学生与用户之间的关系是否是一种关系或是一种关系。它与域问题的对象建模有关。

我怀疑它可能是-a,在这种情况下,你不希望has_one和belongs_to--被称为“合成” - 而是单表继承(STI) - 被称为“继承”。

要问的问题是: 1.学生是否也是用户,即学生是否具有与用户相同的属性和方法,以及更多的方法或限制?因为在这种情况下,学生也是用户,所以学生是否可以拥有0,1个或更多用户的问题不适用。 2.学生是否“拥有”一个用户,也就是说它也可以有0个用户,或者可能有1个以上?

相关问题