Rails 一对一关系

2024-01-07

我有以下内容:

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(使用前将#替换为@)

Rails 一对一关系 的相关文章

  • RSpec 2 中使用 OR 相等

    下面这个例子的正确写法是什么 玩家的分数应等于 5 或 8 it should equal 5 or 8 do player score should 5 or 8 end Thanks Tim 5 or 8将始终产生结果 5 并且不会执行
  • 黄瓜与 RSpec

    我想开始深入研究 BDD 我以前从未使用过 TDD 现在 不确定我是否应该从学习 RSpec 开始 然后跳到 Cucumber 或者直接使用 Cucumber 我一直在互联网上阅读有关两者的内容 在我看来 Cucumber 可能是 RSpe
  • 保护 REST 和 JSON

    我想利用 RESTful 架构构建提供 JSON 数据的 Web 服务 但我只想要我自己的客户端应用程序可以从我的网络服务请求 基本上 我的 Web 服务包含不供公众使用的敏感数据 但我想以这种方式构建它 以便我可以构建连接到我的 Web
  • ubuntu 12.04 ruby​​ 2.0 Rails:找不到“thread_safe”

    我正在 ubuntu 12 04 上安装 Rails 使用以下方法手动安装 如何在 Ubuntu 12 04 上正确安装 ruby 2 0 0 https stackoverflow com questions 16222738 how t
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • Rails 4.1 环境变量未重新加载

    我创建了一个application yml文件在配置目录中并添加了一些键值对 即AWS REGION us east 1 我还添加了以下内容application rb读取文件并更新 ENV 哈希 if Rails env developm
  • 如何使用国家宝石

    我正在尝试使用国家宝石 https github com hexorx countries 但是在我捆绑安装这个 gem 后 有一些关于如何合并它的基本问题 我是否需要创建新的控制器 模型才能访问这些国家 地区 如何创建一个简单的选择下拉列
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r
  • <%=h ... %> 在 Rails 中意味着什么?

    I found here http api rubyonrails org classes ActionView Helpers RecordTagHelper html以下语法 什么是h means 它用于转义标签的输出以避免跨站点脚本
  • 如何在 Ruby 中重写 require ?

    我需要覆盖require来自 Ruby 文件 这是我的 start rb 应用程序入口点 所必需的 rubygems在此之前加载 位于 start rb 中 我尝试的所有操作都出现了堆栈溢出错误 正确的做法是什么 一般来说 如果你想修补一些
  • Rails:Passenger Standalone 适合生产部署吗?

    问题标题几乎概括了这一点 我找不到任何好的资源来概述使用 Phusion Passenger Standalone 进行 Rails 应用程序部署的优点 缺点 它与运行 Passenger Nginx 或 Passenger Apache
  • 如何让 Sidekiq 在 Heroku 上运行?

    这是我第一次尝试让 Redis 在 Heroku 上运行 我添加了一个工作dyno 就在今天 所以还没有付款 添加了RedisToGo Nano附加组件 在我的本地机器上测试了后台作业 并将应用程序推送到heroku heroku ps g
  • Rails 3.2 防止使用错误保存对象

    我有一个 ActiveRecord 对象 我想阻止它被保存 而不对模型进行永久验证 你曾经可以使用做这样的事情errors add但它看起来不再有效了 user User last user errors add name name doe
  • 缺少带有 {:locale=>[:en], :formats=>[:html], 的模板布局/邮件程序

    我正在关注 Michael harlt Rails 教程 但出现此错误 缺少带有 locale gt en formats gt html variants gt handlers gt raw erb html builder 的模板布局
  • 认为 Sphinx 没有为新添加的记录建立索引

    我正在使用 sphinx 搜索 2 个模型及其关联 我正在使用增量索引 在我的开发盒上 在开发模式 Ubuntu 下一切正常 但是 在暂存盒生产环境中 当我创建新记录时 我需要再次构建索引以使新创建的记录可搜索 甚至奇怪的是 当我使用脚本
  • 如何让 Redis 在 Heroku 上启动?

    我已经添加了RedistogoHeroku 上的 nano 插件 我已经在控制台中成功测试了它 但是 当我的应用程序尝试连接 Redis 时 出现以下错误 Heroku 日志文件 2011 10 12T08 19 50 00 00 app
  • 使用 Ruby 重命名 S3 中的对象

    我想使用 Ruby sdk 重命名 s3 中的项目 我该怎么做呢 我努力了 require aws sdk s3 AWS config region gt region access key id gt key secret access
  • 使用 Carrierwave 上传到 S3 时获取 mp3 持续时间

    我正在编写一个应用程序 它基本上是一个音乐平台 我想通过其元数据获取 mp3 的持续时间 并将其保存在表中 然后再将其上传到 S3 我使用载波和雾宝石的组合来上传 提取 mp3 元数据以保存到数据库的推荐方法是什么 有一个用于此类操作的 g
  • 添加多态引用的向下迁移是什么

    我有以下迁移 但不知道在其中使用什么down method change table addresses do t t references addressable polymorphic gt true end 实际上 change ta
  • Rails CSS 样式表相互覆盖

    我在资产 样式表位置有一个clients css和jobs css 每个都有一个各自的控制器 乔布斯是在客户之后用脚手架创造出来的 scaffolds scss 文件为空 application css 为空 当我编码更改时 例如body

随机推荐