关于空belongs_to关联的最佳实践

Joã*_*iel 66 ruby activerecord ruby-on-rails

想象一下以下情况:

我有一个dog模型和一个house模型.狗可以属于房子,房子可以有很多狗,所以:

Class Dog <  ActiveRecord::Base
  belongs_to :house
end

Class House < ActiveRecord::Base
  has_many :dogs
end
Run Code Online (Sandbox Code Playgroud)

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

有更好的做法吗?

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

小智 303

在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定义上禁用此验证,只需传递一个可选的附加选项:true,如下所示:

class Book < ActiveRecord::Base
    belongs_to :author, optional: true
end
Run Code Online (Sandbox Code Playgroud)

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

  • 这是Rails 5用户的答案 (23认同)
  • 在这一个上花了2个晚上...谢谢你们.可以确认可选:true可以解决问题.我的用例是:`class User <ApplicationRecord belongs_to:team,optional:true end class Team <ApplicationRecord has_many:users end` (3认同)

Fle*_*oid 23

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

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