2012-05-05 193 views
46

最佳實踐試想以下情況:關於空belongs_to的關聯

我有一個dog模型和house模型。狗可以屬於一個房子,房子可以有許多狗,所以:

Class Dog < ActiveRecord::Base 
    belongs_to :house 
end 

Class House < ActiveRecord::Base 
    has_many :dogs 
end 

現在,假設我也希望創建一個沒有房子的狗。他們不屬於房子。我仍然可以使用這種關係結構,並且在創建它時根本不通知:house_id

有沒有更好的做法?

Obs .:我用這個比喻來簡化我的問題,但我的真實情況是:我有一個模型,用戶可以生成它的實例。他還可以創建這些實例的集合,但他可以將實例留在集合之外。

+2

yes..you可以留下''house_id'和null'當你'@ dog.house'它會返回'nil',所以你可以檢查它像'如果@dog。房子'等等.. – rubyprince

+2

爲了確保它可以工作,在你的數據庫中,Dog表不應該有't.integer「house_id」,:null => false'的空白部分。 – Ashitaka

回答

22

我認爲這是絕對正常的做法。

您可以將house_idnull的值留在數據庫中,以便不屬於其他模型。

199

要小心這個在Rails的5 ...

belongs_to的默認情況下

需要從現在開始,每一個Rails應用程序將有一個新的配置選項 = config.active_record.belongs_to_required_by_default真實,它在 嘗試保存模型時會觸發驗證錯誤,其中 belongs_to關聯不存在。

config.active_record.belongs_to_required_by_default可以改變 假的,這個保留舊的Rails行爲或者我們可以在每個belongs_to的定義禁用此 驗證,正好路過一個額外的 選項可選:真如下:

class Book < ActiveRecord::Base 
    belongs_to :author, optional: true 
end 

來自:http://blog.michelada.io/whats-new-in-rails-5

+15

這是Rails 5用戶的答案 –

+2

在這一個上花了2晚...謝謝你們。可以確認可選:真是訣竅。我的使用情況是: '類用戶

+0

這救了我很多攪動的,感謝伊萬的Rails5提示。 – Laurie