ruby-on-rails - 一张父表,两张子表
问题描述
我有以下问题,我试图在仅 API 的 Rails 应用程序中建模。一个Business
可以有很多Programs
。AProgram
有许多基本属性。但是,有很多类型的 said Program
, let's sayProgramA
等等ProgramB
,每种都有自己的属性。
我将需要查询属于 a 的所有程序Business
并将其与程序的“类型”一起返回给客户端,以便正确解析它。
如何在 Rails 5 中建模这种关系?
解决方案
这是常见的 STI 继承模式:
# app/models/business.rb
class Business < ActiveRecord::Base
has_many :programs
end
# app/models/program.rb
class Program < ActiveRecord::Base
belongs_to :business
self.inheritance_column = :type
#Defining subclasses
def self.types
%w(A B C)
end
end
# app/models/a.rb
class A < Program; end
# app/models/b.rb
class B < Program; end
# app/models/c.rb
class C < Program; end
你有两张桌子,businesses
桌子和programs
桌子。程序表有一个type
对应于程序类型的列,它具有与其他所有类型相同的其他属性。然后,每种类型的程序都可以具有只有它才有的特定属性。Rails 和 activerecord 会自动处理这个问题,您可以在网上找到一些注意事项。
如果您的程序共享许多属性,这是一个很好的方法,如果它们不共享,则不是那么好。
一些阅读材料:https ://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html
推荐阅读
- ios - 访问 Swift 类的正在运行的实例
- powerbi - 如何显示行小计的最大值?(电源 BI)
- android - 如果在 ViewPager2 中,Listview 中的快速滚动不起作用
- svg - 是否可以替换 HubSpot 代码库中的社交媒体图标?
- python - Python:使用列的最后一个字符将新值填充到现有列
- dart - Flutter signalr_core hub连接测试
- php - guzzlehttp 在 laravel 项目上抛出错误 - strtolower(): Argument #1 ($string) must be of type string, int given
- php - 如何使用 PHP/MYSQL 从我的项目页面在我的项目详细信息页面中显示一项
- openid - Quarkus 从类路径加载第 3 方属性文件
- python - PySide2 中的 QThread 已启动,但未在启动信号上触发插槽