我有以下内容:
class User < ActiveRecord::Base
has_one :car, :class_name => 'Car', :foreign_key => 'user_id'
class Car < ActiveRecord::Base
belongs_to :worker, :class_name => 'User', :foreign_key => 'user_id'
它基本上是用户和汽车之间的一对一关系。
我想要的是用户能够拥有一辆车且只有一辆车。这意味着如果他创建了一辆分配给他的汽车,他将无法创建第二辆汽车。
这怎么可能做到呢?
当然有几种不同的方法可以实现这一点。我建议在该表上创建一个复合键索引,以确保 user_id 在表中是唯一的。这将确保它只出现一次。在迁移中,您可以编写类似这样的内容。
add_index(:cars, :worker_id, :unique => true)
第一个参数是表名(不要忘记这通常是类名的复数版本)。字段名称排在第二位。唯一的 true 会阻止您插入额外的行。
注意:这是数据库级别的约束。如果您因为验证未捕获它而点击此按钮,则会抛出错误。
除了此解决方案之外,您还需要向汽车模型本身添加验证。
validates_uniqueness_of :worker_id, message: "can not have more than one car"
您会看到此错误,类似于“工人 ID 不能拥有多于一辆汽车”。您很可能想要自定义其中的“Worker ID”部分。参考这个post https://stackoverflow.com/questions/808547/fully-custom-validation-error-message-with-rails有关如何执行此操作的说明。
您当然不必执行数据库约束,但如果其他人插入数据库,这是一个好主意。否则,就 Rails 而言,您将拥有“无效”数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)