2012-05-29 121 views
0

我想創建兩個表之間的關聯。學生桌和電腦桌。 一臺電腦只能分配給一名學生(任何時候),但一名學生可以分配給多臺電腦。正確的導軌協會使用

這是我目前的想法。通過關係建立一個有許多關係並修改它。

class Student < ActiveRecord::Base 
    has_many :assignemnts 
    has_many :computers, :through => :assignments 
end 

class Computer < ActiveRecord::Base 
has_one :assignment 
has_one :student, :through => :assignments 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :student 
    belongs_to :computer 
end 

這是否似乎是處理此問題的最佳方法?或者更好的東西迅速響應這裏的專家。謝謝!

回答

1

您需要首先,如果一個簡單的決定對於許多關係來說已經足夠了。

如果是的話,它會變得更容易,因爲你可以擺脫Assignment類和表。

您的數據庫表「電腦」,然後需要一個student_id數據列,與非唯一索引

你的模型應該是這樣的:

class Computer < ActiveRecord::Base 
    belongs_to :student 
end 

class Student < ActiveRecord::Base 
    has_many :computers, :dependent => :nullify 
end 

「依賴廢除」因爲你不想要在刪除學生時刪除計算機,而是將其標記爲空閒。

您的每臺計算機只能分配給一名學生,但您可以將其重新分配給其他學生,例如在下一年。

+0

這實際上似乎是最好的解決方案,它使代碼看起來更乾淨。 – Dan

0

您還可以使用has_and_belongs_to_many方法。你的情況將是:

class Student < ActiveRecord::Base 
    has_many :assignemnts 
    has_and_belongs_to_many :computers, :join_table => 'assignments', 
end 

class Computer < ActiveRecord::Base 
    has_one :assignment 
    has_and_belongs_to_many :student, :join_table => 'assignments', 
end 

,或者你可以重命名錶,分配到computers_students和刪除join_table

class Student < ActiveRecord::Base 
    has_many :assignemnts 
    has_and_belongs_to_many :computers 
end 

class Computer < ActiveRecord::Base 
    has_one :assignment 
    has_and_belongs_to_many :student 
end 
+2

我認爲表名應該是computers_students –

+0

是的,你必須遵循類名的詞法順序。 – thesis

+0

你是對的。 – alexkv

0

其實你的方法是好的,正如@alexkv提供的一個。這是更多的討論,而不是問題。

另一件事,如果你想使用映射表的一些其他目的,如存儲額外的領域 - 那麼你的方法是最好的。在連接模型的has_many :through表中有一個主鍵,可以像任何其他模型一樣包含屬性。

從api.rubyonrails.org:

選擇建立一個多一對多的關係哪種方式並不總是 簡單。如果您需要使用關係模型作爲自己的 實體,請使用has_many:through。當 使用傳統模式或者您從不直接與 關係本身一起工作時,請使用has_and_belongs_to_many。

我可以告訴你讀這一點,明白了什麼辦法更好地在您的情況進行選擇: