2010-07-09 67 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個以上?

相關問題