2012-05-05 145 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