一个父表,两个子表

时间:2019-01-11 22:22:18

标签: ruby-on-rails ruby-on-rails-5

我尝试在仅API的Rails应用中建模时遇到以下问题。一个Business可以有多个ProgramsProgram具有许多基本属性。但是,说Program的类型很多,比如说ProgramAProgramB等,每种都有自己的属性。

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

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

1 个答案:

答案 0 :(得分:0)

这是常见的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