首页 > 编程问答 >Rails - 如何创建关联到 2 个子类的 SIngle Table 继承的一部分

Rails - 如何创建关联到 2 个子类的 SIngle Table 继承的一部分

时间:2024-06-05 08:31:12浏览次数:23  
标签:ruby-on-rails ruby model-view-controller activerecord single-table-inheritance

因此,我设置了单表继承,这样我就可以为 User 表创建两个子类。在我当前的实现中,这两个子类将拥有完全相同的字段,因此我认为 STI 在这里是有意义的。

 类 User < ApplicationRecord
    结束

    类 Student < 用户
    结束

    类 教师 < 用户
    结束

    类 约会 < 应用记录
    结束

我想创建一个与学生有多对一关联、与教师也有多对一关联的预约模型。但是,由于学生和教师属于同一个用户表,我将如何创建数据迁移,以便与这些模型建立关联?

 类 CreateAppointments < ActiveRecord::Migration[7.0]
      def 更改
        create_table :appointments do |t|
          t.datetime :start_datetime
          t.references :users, null: false, foreign_key: true
# t.references :users, null: false, foreign_key: true -->这个应该是为学生设置的
          t.timestamps
        结束
      结束
    结束

我继续使用 STI 是否有意义,还是应该为学生和教师创建单独的表格?目前对我来说没有太大意义,因为它们的字段完全相同。但这样一来,进行预约关联就会变得更加容易。


你目前的数据库架构设计为 单表继承(STI) ,对于 Student Teacher 模型来说是一个不错的选择,因为它们都继承自 User 模型并拥有相同的属性。STI 的优势在于,它可以让你在一个表中存储不同类型的用户,从而简化某些查询。

然而,你遇到的问题在于, Appointment 模型需要与 Student Teacher 都建立关联,而他们都在同一个表中。

解决这个问题有两个主要方法:

1. 使用多态关联:

  • 不需要更改你的数据库架构。
  • Appointment 模型中添加两个新的引用,一个用于 student ,一个用于 teacher
  • 将这两个引用设置为多态的,这意味着它们可以指向不同类型的模型(在本例中是 Student Teacher )。

以下是更新后的迁移文件: ruby class CreateAppointments < ActiveRecord::Migration[7.0] def change create_table :appointments do |t| t.datetime :start_datetime t.references :appointable, polymorphic: true, null: false t.timestamps end end end 你需要在你的模型中添加以下关联: ```ruby class Appointment < ApplicationRecord belongs_to :appointable, polymorphic: true end

class Student < User has_many :appointments, as: :appointable end

class Teacher < User has_many :appointments, as: :appointable end ```

2. 使用独立的表进行关联:

  • 创建两个新的表 student_appointments teacher_appointments ,用于存储与 Student Teacher 的关联。
  • 这些表将包含 appointment_id user_id type (用于区分 Student Teacher )列。

以下是新的迁移文件: ```ruby class CreateStudentAppointments < ActiveRecord::Migration[7.0] def change create_table :student_appointments do |t| t.references :appointment, null: false, foreign_key: true t.references :student, null: false, foreign_key: { to_table: :users } t.timestamps end end end

class CreateTeacherAppointments < ActiveRecord::Migration[7.0] def change create_table :teacher_appointments do |t| t.references :appointment, null: false, foreign_key: true t.references :teacher, null: false, foreign_key: { to_table: :users } t.timestamps end end end 你需要在你的模型中添加以下关联: ruby class Appointment < ApplicationRecord has_many :student_appointments has_many :students, through: :student_appointments has_many :teacher_appointments has_many :teachers, through: :teacher_appointments end

class Student < User has_many :student_appointments has_many :appointments, through: :student_appointments end

class Teacher < User has_many :teacher_appointments has_many :appointments, through: :teacher_appointments end ```

选择哪种方法取决于你的具体需求:

  • 如果你预计将来会有更多类型的用户需要与 Appointment 关联,那么 多态关联 更灵活,因为它不需要你为每种新类型创建新表。
  • 如果你需要在 Student Teacher 关联上添加特定属性,那么 独立的表 更合适,因为它允许你在关联表中添加自定义列。

总的来说, 对于你的情况,我建议使用多态关联,因为它更简洁,并且可以很好地满足你的需求。

标签:ruby-on-rails,ruby,model-view-controller,activerecord,single-table-inheritance
From: 78577951

相关文章

  • Logstash中的ruby
    通常我们都是用filters/grok插件来捕获字段的,但是正则耗费大量的CPU资源,很容易成为Logstash进程的瓶颈。而实际上,很多流经Logstash的数据都是有自己预定义的特殊分隔符的,我们可以很简单的直接切割成多个字段。filters/mutate插件里的"split"选项只能切成数组,后续很不......
  • rbenv:Ruby 多版本管理利器
    在Ruby开发的世界中,经常需要面对不同项目使用不同Ruby版本的情况。这时,一个高效、灵活且易于使用的Ruby版本管理工具就显得尤为重要。rbenv正是这样一个工具,它允许开发者在同一台计算机上轻松安装、切换和管理多个Ruby版本。本文将详细介绍rbenv的安装、基本使用以及......
  • JetBrains RubyMine 2024.1 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE
    JetBrainsRubyMine2024.1(macOS,Linux,Windows)-最智能的Ruby与RailsIDE请访问原文链接:JetBrainsRubyMine2024.1(macOS,Linux,Windows)-最智能的Ruby与RailsIDE,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsRubyMine-最智能的Ru......
  • HTB Perfection-wp 基于ruby的SSTI注入、密码爆破工具hashcat的使用、反弹shell的编码
    一进来发现这个页面,估计突破点就是在这里了 当然也可走一下固定的流程,nmap扫一下、dir爆破一下。这里不太像是sql的注入点(并不是查询功能),就不用sql试了。首先第一反应时看到WEBrick模板框架,考虑有没有版本漏洞,但是在几个CVE数据库搜一下都没有对应版本的漏洞。那么走一下正常......
  • ruby 升级
    一、安装rvm(ruby版本管理)官方文档:RVM:RubyVersionManager-InstallingRVM1.安装GPG密钥gpg--keyserverkeyserver.ubuntu.com--recv-keys409B6B1796C275462A1703113804BB82D39DC0E37D2BAF1CF37B13E2069D6956105BD0E739499BDB如果遇到问题可能需要再次执行一......
  • 2022-12-2-ruby入门
    第一个程序、定义类、打印方法、判断是否有方法属性、放开属性、数组、注释、字符串操作、字典、类型转换、静态方法、继承、模块、流程控制、循环、异常处理第一个程序defsayHelloputs'helloword'endsayHello定义类#类名第一个字母必须大写classPlayerde......
  • Note - Ruby | 葫芦僧乱判葫芦案
    BasedonRubyMonk。因为神秘原因网站挂掉了,所以弄一下,顺便捡起已经生锈的Ruby。推荐的在线编译器:Link。闲话:这样的话肯定interaction会少,可以多手动运行一下代码。以及有些代码可能会调整,但语法内容是一样的。以及本来想用英语写的,因为Ruby真的很English,算了还是用中文......
  • jekyll安装相关,ruby rvm安装记录
    一、安装#安装jekllyhttps://dandelioncloud.cn/article/details/1524755285050953730/配置、添加源:gemsources--addhttps://gems.ruby-china.com/--removehttps://rubygems.org/gemsources-lgemsources-u安装jeklly,安装命令:(sudo命令无)geminstalljekyllbundl......
  • 解决VS Code中使用WSL开发Ruby程序每次打开控制台都需要输入/bin/bash --login的问题
    项目的开发环境是在VSCode上连接WSL开发,使用的语言是Ruby,每次打开控制台都需要先输入/bin/bash--login才能继续输入其他命令,为此,找遍了全网的资料,最终找到了解决的办法,特此记录一下,步骤如下:1.在终端输入vim~/.bashrc回车打开文件2.复制下面的代码粘贴至文件最后[[-s"$HOME/.......
  • RubyMine 2023: 让Ruby开发变得更简单 mac/win版
    JetBrainsRubyMine2023是一款专为Ruby开发者打造的强大集成开发环境。这个版本致力于提供卓越的性能、强大的功能和一流的智能代码编辑支持,帮助您更高效地开发高质量的Ruby应用程序。→→↓↓载RubyMine2023mac+win版首先,RubyMine2023提供了对最新Ruby和相关技术的全面支......