首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rails活动记录:使用自定义id的has_many

基础概念

Rails活动记录(Active Record)是Ruby on Rails框架中的一个ORM(对象关系映射)工具,它允许开发者通过对象和方法来操作数据库中的数据,而不需要直接编写SQL语句。has_many是Active Record中的一个关联方法,用于定义一对多的关系。例如,一个用户(User)可以有多篇文章(Post),那么在User模型中可以定义has_many :posts

使用自定义ID

默认情况下,Rails使用数据库表中的主键(通常是id字段)来标识记录。但在某些情况下,你可能希望使用自定义的ID字段。例如,你可能有一个用户表,其中使用user_uuid作为唯一标识符而不是传统的id字段。

相关优势

  1. 灵活性:允许使用自定义ID可以提供更大的灵活性,特别是在与外部系统集成时。
  2. 安全性:自定义ID可以增加一定的安全性,因为它们不容易被猜测。
  3. 业务逻辑:有时业务逻辑要求使用特定的字段作为标识符。

类型

在Rails中,可以通过几种方式使用自定义ID:

  1. 修改数据库表结构:将主键从默认的id改为自定义字段。
  2. 配置Active Record模型:通过设置self.primary_key来指定自定义ID字段。

应用场景

假设你有一个电商系统,其中每个订单都有一个唯一的订单号(order_number),而不是传统的ID。你可以在Order模型中这样配置:

代码语言:txt
复制
class Order < ApplicationRecord
  self.primary_key = :order_number
end

遇到的问题及解决方法

问题:为什么无法通过自定义ID关联查询?

原因:可能是由于没有正确配置Active Record模型中的self.primary_key,或者在关联定义中没有指定正确的键。

解决方法

  1. 确保在模型中正确设置了self.primary_key
代码语言:txt
复制
class User < ApplicationRecord
  self.primary_key = :user_uuid
end
  1. 在关联定义中指定正确的键:
代码语言:txt
复制
class User < ApplicationRecord
  self.primary_key = :user_uuid
  has_many :orders, primary_key: :user_uuid, foreign_key: :user_uuid
end

示例代码

假设我们有一个用户表(users)和一个订单表(orders),其中用户表使用user_uuid作为主键:

代码语言:txt
复制
# db/schema.rb
create_table "users", primary_key: "user_uuid", force: :cascade do |t|
  t.uuid "user_uuid", default: -> { "gen_random_uuid()" }, null: false
  t.string "name"
  # other fields...
end

create_table "orders", force: :cascade do |t|
  t.uuid "order_uuid", default: -> { "gen_random_uuid()" }, null: false
  t.uuid "user_uuid"
  t.string "order_number"
  # other fields...
end

在User模型中配置自定义ID:

代码语言:txt
复制
# app/models/user.rb
class User < ApplicationRecord
  self.primary_key = :user_uuid
  has_many :orders, primary_key: :user_uuid, foreign_key: :user_uuid
end

在Order模型中配置外键:

代码语言:txt
复制
# app/models/order.rb
class Order < ApplicationRecord
  belongs_to :user, primary_key: :user_uuid, foreign_key: :user_uuid
end

参考链接

通过以上配置,你可以使用自定义ID进行关联查询,例如:

代码语言:txt
复制
user = User.find_by(user_uuid: 'some-uuid')
orders = user.orders

这样可以确保Rails正确处理自定义ID的关联关系。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用Ruby on Rails和Bootstrap开发社交网络平台详细教程

在这篇博客中,我们将深入介绍如何使用Ruby on Rails(RoR)框架和Bootstrap前端框架共同开发一个简单而功能丰富社交网络平台。...Ruby on Rails提供了强大后端支持,而Bootstrap则提供了灵活前端组件,使得我们可以轻松创建现代化用户界面。...你可以使用以下命令进行安装:gem install rails步骤2:创建Rails应用使用以下命令在终端中创建一个新Rails应用:rails new social_network然后进入应用目录:...:posts has_many :friendshipsend步骤8:使用Bootstrap创建界面在app/views/layouts/application.html.erb中添加Bootstrap...通过这个简单例子,你可以深入了解如何使用Ruby on Rails和Bootstrap开发一个社交网络平台。

21010
  • 架构之美:教你如何分析一个接口?

    REST刚出来时候,开发者普遍觉得这是一个好想法,但怎么落地呢?没有几个人想得清楚。 Rails对REST使用方式做了一个约定。...比如,每篇文章可以有多个评论,用Rails方式写出来是这样: class Article < ApplicationRecord has_many :comments ... end 而如果用传统...Java风格,你写出来代码,可能是这个样子: class Article { private List comments; ... } “有多个”这种表示关系语义用has_many...Java后期一些开源项目也开始向Rails学习。比如,使用Spring Data JPA项目后,我们也可以写出类似Rails代码。...使用Rails,这就是一个命令: $ rails new article-app 这个命令执行结果生成不仅仅是源码,还有一些鼓励你去做最佳实践,比如: 它选择了Rake作为自动化管理工具,生成了对应

    2.2K20

    我发现了一个非常酷软件,用自然语言编程!

    来源 | 码农翻身(公众号id:coderising) 周六晚上10点半, 张大胖兴冲冲地在微信上找我:“欣哥,我发现一个编程软件,非常酷!” 我:“别烦我!我忙着追剧呢。”...“有点明白了,也就是说,这个Metacode自定义了一个更加高层语言,程序员可以用这个语言中指令来写程序, 然后Metacode再把他们转化成实际代码。”...“Ruby on Rails(简称)中Active Record是DSL一个典型。” “又一个新词!什么是Active Record? ” 隔着屏幕,我都能感受到张大胖有点儿不满。...has_many :books, dependent: :destroyend “当你这么写了以后,神奇事情发生了,按照约定,RoR会得知在数据库表中下图所示关系,然后你Author类突然拥有了很多有用新方法...“还有一种办法就是‘寄生’在别的语言中,利用别的语言(Ruby ,Python)动态特性,构建你自己语法,像刚才has_many就是这么做,这种方式叫做内部DSL。” "好麻烦!"

    91420

    记录使用python图形库自定义位置组件技术

    使用技术 使用自定义位置技术可以通过place方法来实现。这里是如何使用这种技术一般步骤: 创建一个Label或Button等组件,并设置相关属性(例如文本、图像、背景色等)。...使用place方法设置组件位置,通过指定x和y参数来调整组件在窗口中位置。...下面是一个简单示例代码,展示了如何使用自定义位置技术: import tkinter as tk # 创建主窗口 window = tk.Tk() window.title("自定义位置示例") window.geometry...window.mainloop() 在这个示例中,我们创建了一个Label和一个Button,并使用place方法将它们放置在窗口中自定义位置。...你可以根据需要调整x和y值来调整组件位置。 展示一下这个效果 自定义位置还是很不错 结语 这个代码以后我可能要用,写出来记录一下。

    12810

    Rails路由

    有时候在复数资源中希望能够不使用ID就能查找资源,如显示当前登录用户信息: get 'profile', to: 'users#show' 如果 get 方法to选项值是字符串,那么这个字符串应该使用...,这种情况非常常见: class Magazine < ApplicationRecord has_many :ads end class Ad < ApplicationRecord...方法时传入一组对象,Rails会自动确定对应路由: Rails能够识别各个实例,自动使用...get "忽如寄" , to: 'welcome#index' 自定义资源路由 指定控制器 :controller 选项用于显式指定资源使用控制器: resources :photos, controller...和 edit 动作上 限制创建路由 Rails 默认会为每个 REST 式路由创建7个默认动作,可以使用 :only 和 :except 选项来微调此行为。

    4.5K20

    重新温习软件设计之路(2)

    郑晔老师打了一个生动比方(惊呼郑晔老师打比方能力,这是需要深刻理解本质才能做出比方),你原本打算买一套家具,但是现在需要你必须了解树是怎么种、怎么伐 又是 怎么加工生产一些列工作,然而你想要就仅仅是一套能直接使用家具而已...比如,从Rails对外暴露REST接口设计中,可以看到,它对REST使用方式做了一个约定,只要遵循Rails习惯写法,写出来结果就基本上符合REST规范。...换句话说,Rails将REST这个模型用一种更实用方式落地了。 Rails.application.routes.draw do ......又如,从Rails程序员编写API接口设计中,可以发现它十分关注API表达性,可以很方便地表达一对多关系: class Article < ApplicationRecord has_many...{ get; set; } ... } 而这样风格,并没有错,只是无法很直白表现出一对多关系,而Railshas_many”表达地更加直白。

    82430

    不是 Ruby,而是你数据库

    虽然有些 Ruby 项目不使用 Rails,但大部分生产中运行 Ruby 代码都是基于 Rails 开发。...这个例子展示了从表中获取一条记录操作,虽然它并非关系型数据库所擅长领域,但它揭示了 ORM 存在实际性能问题:缺乏连接、排序、过滤和计算等操作。...因此,即使 ORM 性能较差,数据库仍然是主要耗时组件。 扩大规模 我们都曾遇到过这样情况:Ruby/Rails 代码变得错综复杂,设置糟糕透顶,以至于堆栈(或自定义代码)成为瓶颈。...未优化连接。添加简单 has_many 太容易了,这使得开发人员可以在数据库中启动过于繁重查询。一旦通过应用程序引入和传播,这几乎不可能解决。...使用难以筛选、分组或排序或优化不佳列。使用非索引列。 我经验法则是,每个添加或删除 where、has_many、group 或任何此类 active-record 方法都必须伴随着数据库迁移。

    12830

    GitHub 关系型数据库垂直分库实践

    十多年前,与当时大多数 Web 应用程序一样,GitHub 也是一个使用 Ruby on Rails 开发网站,它大部分数据都保存在 MySQL 数据库中。...`id` = `repositories.owner_id` /* cross-schema-domain-query-exempted */ 将所有查询加上注解,就可以得到需要修改查询语句清单。...另一种比较有挑战性情况是 has_many :through 关系导致需要连接来自不同模式领域表。...例如,使用两个单独查询替代 INNER JOIN,然后在 Ruby 中执行“union”操作(例如,A.pluck(:b_id) & B.where(id:...))。...我们将在后续文章中分享更多与之相关工具、Linter 和 Rails 改进细节内容。 结 论 在过去十多年,GitHub 学会了如何通过伸缩数据库来满足不断增长需求。

    1.5K11

    对C7V5主题修改记录及本站使用自定义代码等

    本篇文章主要记录了我对本博正在使用主题-C7V5 进行一些修改,方便给有需要的人参考,也为了日后升级主题时做一个参考。其中在 functions.php 中添加代码几乎都不是原创。...自定义网站页面右侧滚动条 将下面代码添加到主题自定义 css 或者 style.css 文件中就行: /*—滚动条默认显示样式–*/ ::-webkit-scrollbar-thumb{ background-color...评论作者链接新窗口打开 function my_get_comment_author_link() { $url = get_comment_author_url( $comment_ID...); $author = get_comment_author( $comment_ID ); if ( empty( $url ) || 'http://' == $...原创文章采用CC BY-NC-SA 4.0协议进行许可,转载请注明:转载自:对C7V5主题修改记录及本站使用自定义代码等

    77150

    好物周刊#40:多功能文件管理器

    村雨遥好物周刊,记录每周看到有价值信息,主要针对计算机领域,每周五发布。 一、项目 1....Material Design User Interface[2] 使用 Web Components 实现,遵循 Material You 设计规范 Web 前端组件库。 3....WeChatMsg[6] 提取微信聊天记录,将其导出成 HTML、Word、CSV 文档永久保存,对聊天记录进行分析生成年度聊天报告。 三、网站 1....字体天下 [8] 提供中文字体、手写字体、英文字体、图形字体等各种字体高速免费下载和在线预览服务。 3. 逗比表情包 [9] 专业表情包搜索网站,不仅有精选表情,还有精选套图以及表情自定义。...Rails Girls 教程 [14] 教程宗旨是给女性提供一个交流技术和实现理想工具和社区,您可以在这里学习怎样自行组织活动、上传更多原创教程,当然也可以仅仅专注于学习 Rails。 3.

    13710

    GitLab安装与基础使用

    活动源和维基 它配备了 GitLab CI,用于持续集成和交付 0x01 环境安装 CentOS Gitlab 基础要求:至少4GB空闲RAM来运行GitLab 系统:CentOS Linux release...Step8.英文可能对英语不好新手可能不友好,我们进行汉化(注意:高于12.3.5版本无需汉化,直接在用户设置里面进行设置自定义语言选择简体中文); #停止gitlab gitlab-ctl stop...WeiyiGeek. (3) gitlab-ce版本升级记录 我们为了保证数据安全,一步步来慢慢升级,使用官方源可能比较慢,可以使用国内源(采用Omnibus方式进行升级直接rpm包部署):https...建议:如果非必要功能需求,只是简单要一个代码仓库的话,个人建立使用在11.x.-12.3.x之间也不错了。....修改配置文件添加最后两行egrep -v "^#|^ 连接上后找到对应identities表修改对应字段,其实就是把字段中user_id修改掉,我这里做法就是把用户user_id改成了负数,这样在

    8.5K20

    企业自建GitLab代码仓库安装与基础配置使用

    活动源和维基 它配备了 GitLab CI,用于持续集成和交付 0x01 环境安装 CentOS Gitlab 基础要求:至少4GB空闲RAM来运行GitLab 系统:CentOS Linux release...Step8.英文可能对英语不好新手可能不友好,我们进行汉化(注意:高于12.3.5版本无需汉化,直接在用户设置里面进行设置自定义语言选择简体中文); #停止gitlab gitlab-ctl stop...主机都是禁用了25端口,所以这个gitlab.rb配置就有做相应改变,使用465协议。...我们为了保证数据安全,一步步来慢慢升级,使用官方源可能比较慢,可以使用国内源(采用Omnibus方式进行升级直接rpm包部署):https://mirrors.tuna.tsinghua.edu.cn...user_id修改掉,我这里做法就是把用户user_id改成了负数,这样在Ldap认证时就找不到了,从而走标准认证(这是在不重启Gitlab情况下进行)。

    9.4K55
    领券