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

Rails STI父模型has_many是否需要关联类上的类型?

Rails STI(Single Table Inheritance)是一种面向对象的设计模式,用于在数据库中存储不同类型的对象,并且共享相同的表结构。在STI中,父模型可以通过has_many关联多个子模型,但是否需要关联类上的类型取决于具体的需求。

如果父模型需要通过关联类上的类型来筛选子模型,那么需要在父模型中定义关联时指定类型。这样可以确保只有符合指定类型的子模型被关联到父模型上。例如,假设有一个父模型为"Product",子模型有"Book"和"Movie",并且需要通过父模型获取所有类型为"Book"的子模型,可以这样定义关联:

代码语言:txt
复制
class Product < ApplicationRecord
  has_many :books, -> { where(type: 'Book') }, class_name: 'Product', foreign_key: 'parent_id'
end

在上述代码中,通过where(type: 'Book')指定了关联类上的类型为"Book",这样只有类型为"Book"的子模型才会被关联到父模型上。

然而,如果不需要通过关联类上的类型来筛选子模型,可以省略关联时指定类型的步骤。这样父模型的has_many关联会包含所有子模型,无论其类型是什么。例如,如果不需要区分"Book"和"Movie",可以这样定义关联:

代码语言:txt
复制
class Product < ApplicationRecord
  has_many :products, foreign_key: 'parent_id'
end

在上述代码中,没有指定关联类上的类型,所有类型的子模型都会被关联到父模型上。

总结起来,是否需要在父模型的has_many关联中关联类上的类型取决于具体的需求。如果需要通过类型来筛选子模型,则需要在关联时指定类型;如果不需要区分子模型的类型,则可以省略类型的指定。

腾讯云相关产品和产品介绍链接地址:

请注意,以上产品仅作为示例,实际选择产品时应根据具体需求进行评估和选择。

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

相关·内容

Rust Web 生态观察| SeaORM :要做 Rust 版本 ActiveRecord

“Active Record ,是一种领域模型模式,特点是一个模型对应关系型数据库中一个表,而模型一个实例对应表中一行记录。...Rails Active Record ORM 框架,和 Rails 框架一样,遵循是「约定大于配置」惯例。比如 : User 模型,对应是 users 表。遵循单复数约定。...Go 语言生态中也有同名数据库包,不确定 Rust 这个 sqlx 命名是否参考它。...至少你现在已经对 ActiveRecord 有了一个初步印象: 数据模型 和 数据表 存在一一映射关系,命名甚至可能还有默认约定存在。...` 函数来指定 Cake 和 Fruit 一对多关系 // Cake has_many Fruit // 返回是 RelationDef 类型

9.9K20

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

这一讲,我们就来一起来学习怎样看接口,我选择项目是Ruby on Rails,因为它接口设计风格是带给我最多震撼,无论是编程接口优雅,还是开发过程接口顺畅。 看设计要先看模型。...Ruby on Rails模型 Rails是标准基于MVC模型进行开发Web框架,给行业带来巨大冲击是它接口设计。...只要你遵循Rails惯用写法,写出来结果基本就是符合REST结构,也就是说,Rails把REST这个模型用一种更实用方式落地了。...比如,每篇文章可以有多个评论,用Rails方式写出来是这样: class Article < ApplicationRecord has_many :comments ... end 而如果用传统...执行下面的命令,它会帮你生成一个controller,生成对应页面,甚至包括了对应测试,这同样是一个鼓励测试最佳实践。

2.2K20

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

X语言: 我在这儿-> 《当世界只剩下一个Java程序员》 Z语言: 我在这儿-> 《Z语言传奇》 我放下了《破冰行动》,打开了张大胖发给我连接: https://metacode.app/。...“Ruby on Rails(简称)中Active Record是DSL一个典型。” “又一个新词!什么是Active Record? ” 隔着屏幕,我都能感受到张大胖有点儿不满。...“举个例子,你有两个业务相关,一个是Author, 另外一个是Book, 现在你想把他们之间建立关联, 也就是说一个作者可以有多本书,DSL可以这么写:” class Author < ApplicationRecord...has_many :books, dependent: :destroyend “当你这么写了以后,神奇事情发生了,按照约定,RoR会得知在数据库表中下图所示关系,然后你Author突然拥有了很多有用新方法...“因为DSL本质是一个语言,所以你首先定义自己语法,然后再考虑怎么实现这个语法, 一种办法是你用Lex,YACC,ANTLR等工具自己把这个语言给实现了,这叫外部DSL。 ” “自己实现语言?

89120

Rails路由

belongs_to :magazine end 通过嵌套路由来反映模型关联: resources :magazine do resources :ads end ?...经验告诉我们嵌套资源层级不应该超过一层,而避免嵌套过深方法之一就是把动作集合放在资源中,这样既可以表明层级关系,又不必嵌套成员动作: resources :articles do resources...: {format: 'jpg'} Rails会把 /photos/12 路径映射到 Photos#show 动作,并把 params[:format] 设为 'jpg' 当然 defaults 还有块形式.../%{name}') redirect 默认是301永久重定向,有些浏览器和代理服务器缓存这种类型重定向,从而导致无法访问重定向前网页,为了避免这种情况,我们可以使用 :status 选项修改响应状态...和 edit 动作 限制创建路由 Rails 默认会为每个 REST 式路由创建7个默认动作,可以使用 :only 和 :except 选项来微调此行为。

4.4K20

如何从 MongoDB 迁移到 MySQL

、数组和哈希等集合类型、多对多关系实现,很多问题都不是仅仅能通过数据迁移解决,我们需要在对数据进行迁移之前先对部分数据结构进行重构,本文中后半部分会介绍需要处理数据结构和逻辑。...通过这段代码我们就可以轻松将原有的嵌入关系全部展开变成引用关系,将嵌入关系变成引用除了做这两个改变之外,不需要做其他事情,无论是数据查询还是模型创建都不需要改变代码实现,不过记得为子模型模型外键添加索引...,否则会导致模型在获取自己持有的全部子模型时造成全表扫描: ?...首先当然是更改模型』,把所有的 Mongoid::Document 都改成 ActiveRecord::Base,然后创建对应 Migration 迁移文件: ?...我们获得当前所有结尾为 _uuid 属性,然后遍历所有的数据行,根据 uuid 值和 post_uuid 属性中 “post” 部分获取到表名,最终得到对应关联模型,在这里我们也处理了类似多态特殊情况

5K52

重新温习软件设计之路(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”表达地更加直白。...对于模型,我们需要尽可能了解它来龙去脉,要解决问题,为什么要解决这个问题。对于接口,我们需要找到主线,然后看风格。对于实现,我们需要带着自己问题,了解软件结构和关键技术。

80830

TP入门第十二天

> 注意函数定义和使用顺序对应关系,通常来说函数第一个参数就是前面的变量或者前一个函数调用返回结果,如果你变量并不是函数第一个参数,需要使用定位符号,例如: {$create_time|date...避免js混乱:可以使用在大括号之后加入空格、使用literal、修改定界符 2、关联模型 关联关系: 一对一关联 :ONE_TO_ONE,包括HAS_ONE 和 BELONGS_TO 一对多关联 :ONE_TO_MANY...,包括HAS_MANY 和 BELONGS_TO 多对多关联 :MANY_TO_MANY 关联关系包括下面四种:HAS_ONE、BELONGS_TO、HAS_MANY和MANY_TO_MANY。...一个模型根据业务模型复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型 $_link成员变量里面定义,并且可以支持动态定义。...要支持关联操作,模型必须继承RelationModel(重要属性请参看手册进行学习研究) 具体关联CURD操作手册中有详细讲解,后续开发中使用到会有详细说明

96260

不是 Ruby,而是你数据库

然而,当人们抱怨 “Ruby 很慢” 时,当深入研究时,通常可以细分为以下三: Ruby 很慢,这对我们用例来说是个问题。Ruby 很慢,但实际对我们来说并不重要。...当你一遍又一遍地运行此操作时,这一天只需要几分钟时间:在开发过程中运行大约 20 次脚本总共需要 1.2 秒,然后可能每周运行一次。 虽然我只关注 CPU,但内存也是一个重要问题。...为了深入分析这个问题,我将会比较一些非 Rails、非 HTTP、纯 Ruby 脚本。 Ruby 在处理大量数据方面并不擅长,但从本质讲,这正是 Web 服务所需要。...我需要运行两个版本 2000 多次,然后我花在开发 Rust 版本额外时间才能在等待它运行额外时间中得到回报。...[3] 一个快速 grep:超过 9000 个,超过 33000 个方法;不包括所有神奇动态方法,比如围绕数据库模型方法。这还不包括 rails 本身附带 70 多个依赖项。

11430

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

十多年前,与当时大多数 Web 应用程序一样,GitHub 也是一个使用 Ruby on Rails 开发网站,它大部分数据都保存在 MySQL 数据库中。...另一种比较有挑战性情况是 has_many :through 关系导致需要连接来自不同模式领域表。...结果被收集起来,用于分析哪些地方存在跨领域事务,这样我们就可以决定是否要更新某些代码或修改我们数据模型。 对于那些对事务一致性要求很高地方,我们将数据抽取到同属一个模式领域新表中。...我们用 ProxySQL 实现 MySQL 主实例之间多路客户端连接。cluster_b ProxySQL 将流量路由到 cluster_a 主实例。...我们将在后续文章中分享更多与之相关工具、Linter 和 Rails 改进细节内容。 结 论 在过去十多年,GitHub 学会了如何通过伸缩数据库来满足不断增长需求。

1.5K11

Active Record基础

Active Record重要功能有: 表示模型和其中数据 表示模型之间关系 通过相关联模型表示继承层次结构 持久存入数据之前,验证模型 以面向对象形式操作数据库...Active Record 约定 命名约定 Rails模型名转换为复数,然后查找对应数据表,Rails提供单复数转换功能非常强大,名应该使用驼峰命名: ?...创建模型关联后,Active Record 会查找这个字段。 主键: 默认情况下,使用证整数字段id作为表主键。...还有一些可选字段:created_at、updated_at、type、lock_version 创建 Active Record 模型需要继承 ApplicationRecord 就行: class...Product < ApplicationRecord end 如果应用需要使用其他命名约定,或者在 Rails 中使用已有的数据库,则可以覆盖默认命名约定,如修改表名和主键名: class

3.2K20

总结Web应用中常用各种Cache

Nginx缓存 有一些资源可能会被调用很多,又无关用户状态,并且很少改变,比如新闻app列表api,购物网站上ajax请求分类菜单,可以考虑用Nginx来做缓存。..., "xxx", :expires_in => 1.day do 小技巧2:关联对象自动更新 常使用对象update_at时间戳来作为cache key,可以在关联对象加上touch选项,自动更新关联对象时间戳...,比如我们可以在更新或者删除文章评论时候,自动个更新: class Article has_many :commentsendclass Comment belongs_to :article...数据查询缓存 通常来说web应用性能瓶颈都出现在DB IO,做好数据查询缓存,减少数据库查询次数,可以极大提高整体响应时间。 数据查询缓存分2种: A....,cache设置灵活,也方便扩展,缺点是需要用不同查询方法名(fetch),以及额外关系定义。

4.7K40

Active Record 数据验证

数据验证概览 为什么要做数据验证 数据验证确保只有有效数据才能存入数据库,在模型中做验证是最有保障,只有通过验证数据才能存入数据库。...Person < ApplicationRecord validates :terms_of_service, acceptance: true end validates_associated 如果模型与其他模型关联...,而且关联模型需要验证,就是用这个方法,保存对象时,会在相关联每个对象上调用 valid?...class Library < ApplicationRecord has_many :books validates_associated :books end 不要在关联两端使用...end uniqueness 这个方法在保存对象前验证属性值是否唯一,这个方法不会在数据库中创建唯一性约束,所以有可能两次数据库连接创建记录具有相同值,所以最好在数据库字段建立唯一性约束。

1.4K20

AFNetworking源码探究(十一) —— 数据解析之子类中协议方法实现

回顾 一篇我们主要介绍了有关数据解析和协议,以及实现解析架构,这一篇就分开讲述各个是如何实现对应数据解析。...这个是所有其他解析,他遵守上面的AFURLResponseSerialization协议。...(b) 第一个if判断 在上面最外层判断内部是两个if判断,根据不同条件判断数据是否有效以及在无效时应该抛出怎样异常。...*error = validationError; 这个方法就是来判断返回数据与咱们使用解析器是否匹配,需要解析状态码是否匹配。...后记 本篇讲述了一个AFURLResponseSerialization协议以及AFHTTPResponseSerializer和AFJSONResponseSerializer那个协议方法实现

1.2K30

数据挖掘工程师:如何通过百度地图API抓取建筑物周边位置、房价信息

前提是rails服务器里已经有相应房屋数据,如房屋街道地址,小区名字等. 接下来需要就是为周边信息数据建表以及相应关联表(因为它们为多对多关系) ?...2.流程详解 js代码在用户浏览器中执行,因此爬取主要部分逻辑都需要写在js脚本里,而rails服务器端需要完成是获得当前需要抓取房屋数据以及储存js抓取数据。...3.2 服务器端(rails controller) SpidersController 1.return_next: 通过变量@@house_id确定当前需要查询房屋id,这个全局id变量随着return_text..., 创建相应记录. attr中存放着每条周边数据经度,维度以及名字; obj为名,如Bus, Subway, 通过find_by()方法查询这个经度和维度是否已经存在,若已经存在此记录, 说明之前存过了...), 因此有几类周边类型,就需要多少个关联表,本文共有Bus, Hospital, Work, School, Subway, Shop 6周边数据, 所以需要维护6个关联表,BusHouses是其中一种

3.9K90

RubyMine 2022 Mac(Ruby代码编辑器) 中文版

JetBrains RubyMine 2022 for Mac是应用在Mac一款强大Ruby代码编辑器,可以通过可定制配色方案,键盘方案以及高效开发所需所有外观设置,智能导航一键导航到声明,超级方法...在Rails应用程序中快速切换模型,视图和控制器。高级搜索选项跳转到任何,文件或符号:按模式和文件夹过滤,或使用正则表达式。甚至可以找到任何IDE动作或工具窗口。...结构视图通过使用Structure工具窗口或特殊弹出窗口,可以在方法(包括继承方法)或HTML标记之间轻松切换。使用层次结构窗格查看和搜索类型,还有超类型和子类型。...3.Ruby工具使用集成Rake,Bundler等等运行Rails生成器和服务器,Rake和Bundler任务。使用模型// gem依赖关系图分析项目结构。...Ruby文档RubyDoc文档离您代码只有一次点击,随时可以在您需要帮助时打开。或者用YARD创建你自己可用文档。

2K10

JetBrains RubyMine 2022 Mac(Ruby代码编辑器)

JetBrains RubyMine 2022 for Mac是应用在Mac一款强大Ruby代码编辑器,可以通过可定制配色方案,键盘方案以及高效开发所需所有外观设置,智能导航一键导航到声明,超级方法...在Rails应用程序中快速切换模型,视图和控制器。高级搜索选项跳转到任何,文件或符号:按模式和文件夹过滤,或使用正则表达式。甚至可以找到任何IDE动作或工具窗口。...结构视图通过使用Structure工具窗口或特殊弹出窗口,可以在方法(包括继承方法)或HTML标记之间轻松切换。使用层次结构窗格查看和搜索类型,还有超类型和子类型。...3.Ruby工具使用集成Rake,Bundler等等运行Rails生成器和服务器,Rake和Bundler任务。使用模型// gem依赖关系图分析项目结构。...Ruby文档RubyDoc文档离您代码只有一次点击,随时可以在您需要帮助时打开。或者用YARD创建你自己可用文档。

2.1K10

Go或者C中调用Lua业务脚本,实现终端应用热更新机制

随着5G网络普及,大胆预测下未来终端架构发展两个方向,终端设备功能将会更加强大和智能。 一是随着5G普及,联机业务,终端设备业务会轻量化,即瘦客户端思想。...每次升级不用整个都升级,可能仅需要写好业务脚本把轻量几K脚本下发下去实现应用热更新,用户无感知。 借用docker图标来说下,它图标很形象,一个大船拖动了很多集装箱。...前期基础和轮子打造需要下点功夫,而后续业务实现可能很简单,就是在大容器环境下写业务脚本,类似搭积木方式灵活实现业务和快速更新迭代。...以下是Go应用中调用Lua业务脚本一个尝试:(注,同时在电脑和ARM板子已验证都是可行) 以下是我一个验证: package main import ( "fmt" "github.com...采用统一消息类型标识识别方式进行处理 --通信协议格式: MTI+STI+DBL+DATA --签到报文 , MTI = 'B001' --消息类型标识 STI = '52' --请求类型标识

72920

【BCVP升级】泛型主键使用

1、自定义特性 配置服务SqlsugarSetup 既然要实现泛型主键,那我们就需要对主键进行处理,因为只有int类型主键才需要自增,其他类型是不需要,当然如果在非int类型主键配置自增了也是会报错...修改实体基RootEntityTkey 这里我重写了一个基于泛型主键实体基RootEntityTkey,因为有了上边配置,所以就不需要在主键增加自增了,只需要配置一个属性:是否为主键即可,因为肯定不为空...我参照着实体泛型基,又单独针对特定有外键需求实体,抽离了一个中间,请注意我命名:实体-->(非必须)-->泛型基,用UserRole来举例。...CreateId { get; set; } // 其他属性字段 } 2、然后抽离,对外键和Pid等单纯处理 /// /// 用户跟角色关联表 /// /// 。

64410
领券