首页 > 解决方案 > 一张父表,两张子表

问题描述

我有以下问题,我试图在仅 API 的 Rails 应用程序中建模。一个Business可以有很多Programs。AProgram有许多基本属性。但是,有很多类型的 said Program, let's sayProgramA等等ProgramB,每种都有自己的属性。

我将需要查询属于 a 的所有程序Business并将其与程序的“类型”一起返回给客户端,以便正确解析它。

如何在 Rails 5 中建模这种关系?

标签: ruby-on-railsruby-on-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


推荐阅读