在Rails中有更优雅的方法吗(has_one association)

时间:2010-07-09 15:55:22

标签: ruby-on-rails

嘿,我是Ruby和Rails的新手。我想知道我是否以正确的方式这样做。

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

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

5 个答案:

答案 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个用户?