2013-03-21 76 views
1

剛學軌...爲什麼我無法將對象添加到關係中?

我有以下型號:

class TimeSlot < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

class User < ActiveRecord:: 
    has_and_belongs_to_many :time_slots 
end 

我也有一個模型,加入二:

class TimeSlotsUsers < ActiveRecord::Base 
    attr_accessible :time_slot_id, :user_id 
end 

在控制檯中,我創建了一個用戶對象,我想將它與TimeSlot關聯起來。我有一個變量ts,它是一個TimeSlot對象,而u是一個用戶對象。兩者已經存在於數據庫中。當我做ts.users << u時,出現錯誤說「ActiveRecord :: StatementInvalid:SQLite3 :: ConstraintException:time_slots_users.created_at可能不是NULL:INSERT INTO」time_slots_users「(」time_slot_id「,」user_id「)VALUES(1,1)。

爲什麼會created_at在TimeSlotsUsers記錄被創建時爲空?是不是被自動創建的嗎?我需要通過關係使用具有一對多的呢?

回答

2

如果您想將user_id和timeslot_id以外的任何信息作爲關係鏈的一部分,則聯接模型是一種很好的模式。例如,如果您有groupsusers,並且您擁有多對多關係,但有時用戶是組的admin,則可以將is_admin屬性放在連接模型上。

爲了使您的加盟模式,更好的Rails的圖案是如下...

class TimeSlot < ActiveRecord::Base 
    has_many :time_slot_users 
    has_many :users, through: :time_slot_users 
end 

class User < ActiveRecord::Base 
    has_many :time_slot_users 
    has_many :time_slots, through: :time_slot_users 
end 

class TimeSlotsUsers < ActiveRecord::Base 
    belongs_to :users 
    belongs_to :time_slots 
end 

我與主張聯結表中沒有主鍵其他答案的一個不同意。
例如,要使用REST API刪除或編輯該關係時,擁有唯一的關係標識非常重要。是否有updated_atcreated_at取決於它們是否是問題域中的有用數據。例如,可能有用的信息是知道用戶何時被添加到組中(或者它可能不是)。

爲確保數據完整性,在(user_id,time_slot_id)上的連接表上有一個唯一索引是非常重要的。 Rails模型可以在99.999%的實例中可靠地驗證唯一性,但不是100%的時間。

+1

當使用'has_and_belongs_to_many'時,'updated_at'和'created_at'列不會被Rails設置。獲得這種工作的唯一方法是通過黑客入侵Rails或向數據庫添加觸發器。你可能會刪除它們,或者至少不要求它們。無法真正確定是否需要'has_many:through',但從連接模型看來,time_slots_users'實際上只是一個連接表,沒有任何額外的屬性。在這種情況下,一個簡單的'has_and_belongs_to_many'就足夠了,我的答案解決了這個問題。我同意你的其他意見。 – Mischa 2013-03-21 13:34:45

+0

啊!我沒有意識到'updated_at'和'created_at'沒有設置。這就說得通了。就設計而言,現在該表是一個簡單的連接表。 – 2013-03-21 15:41:28

1

了的habtm關係should not have created_at and updated_at columns連接表。你也不需要加入模型

如果你想對連接tabel和/或添加屬性做些什麼,你應該改變爲has_many :through

+0

當你說我不需要連接模型時,你是什麼意思?連接表不是必需的嗎? – 2013-03-21 15:42:11

+0

@JeffreyGuenther:表是必要的,但不是模型。 – Mischa 2013-03-21 15:43:01

+0

明白了。表必須存在於數據庫中,但不需要定義Ruby/Rails對象。 – 2013-03-21 15:44:04

相關問題