ruby-on-rails - Rails 一对一关系

标签 ruby-on-rails ruby one-to-one

我有以下内容:

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 会阻止您插入额外的行。

注意:这是数据库级别的约束。如果你因为验证没有捕捉到它而点击它,它会抛出一个错误。

除了此解决方案之外,您还需要对 Car 模型本身添加验证。

validates_uniqueness_of :worker_id, message: "can not have more than one car"

您会看到此错误伴随着类似“Worker ID can not have more than one car”之类的内容出现。您很可能希望自定义其中的“Worker ID”部分。引用这个post有关如何执行此操作的说明。

您当然不必执行数据库约束,但万一其他人插入到数据库中,这是个好主意。否则,就 Rails 而言,您将拥有“无效”数据。

关于ruby-on-rails - Rails 一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15098586/

相关文章:

c# - Entity Framework 与有时独立的类一对一

ruby-on-rails - rake 数据库 :Create will not connect to PostGresql and set up database

ruby-on-rails - 在 ruby​​ on Rails 中立即为所有用户创建出勤情况

ruby - 如何引用不同类中的方法和另一个类中的方法?

ruby - 如何使用 Celluloid 从线程池运行 HTTP 请求?

Java: hibernate @OneToOne 映射

ruby-on-rails - 如何在 JSONAPI::Resource 中执行 `has_one: model, through: join_model`

javascript - rails 4 x Bootstrap 3 : Dismissible alerts not working

ruby - 是否可以在 Ruby 中显式包含子模块或类?

Django 管理员 : How to display value of fields with list_display from two models which are in oneToOne relation?