有关空的belongs_to关联的最佳实践


75

想象一下以下情况:

我有一个dog模特和一个house模特。狗可以属于一所房子,而房子可以有许多狗,因此:

Class Dog <  ActiveRecord::Base
  belongs_to :house
end

Class House < ActiveRecord::Base
  has_many :dogs
end

现在,想象一下我也想创造没有房子的狗。他们不属于房屋。我仍然可以使用该关系结构,而:house_id在创建它时不通知它吗?

有更好的做法吗?

观察:我用这个比喻简化了我的问题,但是我的真实情况是:我有一个模型,用户可以生成它的实例。他还可以创建这些实例的集合,但可以将实例保留在集合之外。


2
是的..您可以离开house_id null,等@dog.house它返回时再nil检查if @dog.house,依此类推
。–

2
为确保此方法有效,在您的数据库中,Dog表不应包含的null部分t.integer "house_id", :null => false
2012年

Answers:


27

我认为这是绝对正常的做法。

你可以只留下house_idnull价值在数据库中不属于其他车型。


332

在Rails 5中要特别小心...

#belongs_to默认是必需的

从现在开始,每个Rails应用程序都会有一个新的配置选项config.active_record.belongs_to_required_by_default = true,当尝试保存belongs_to不存在关联的模型时,它将触发验证错误 。

config.active_record.belongs_to_required_by_default可以更改为 false并保持原来的Rails行为,或者我们可以对每个belongs_to定义禁用此验证,只需传递一个附加选项optional: true,如下所示:

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

from: https://sipsandbits.com/2015/09/21/whats-new-in-rails-5/#belongs_toisrequiredbydefault


30
this is the answer to Rails 5 users
Iván Cortés Romero

3
Spent 2 nights on this one... thanks guys. Can confirm optional: true does the trick. My use case was: class User < ApplicationRecord belongs_to :team, optional: true end class Team < ApplicationRecord has_many :users end
Ryan Buckley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.