📜  rails class sti 提醒 - Ruby (1)

📅  最后修改于: 2023-12-03 15:19:41.664000             🧑  作者: Mango

Rails Class STI 提醒 - Ruby

在 Rails 中,STI(Single Table Inheritance)通常用于实现继承关系。基类中定义了所有共享的属性和方法,子类中定义了特殊的属性和方法。所有的数据都存储在同一个数据表中,因此称为“单表继承”。

配置模型

定义一个用于继承的基类模型,例如:

class Vehicle < ApplicationRecord
  self.abstract_class = true  # 声明为抽象类,不会创建对应的数据表
end

然后定义若干个子类模型,例如:

class Car < Vehicle
end

class Motorcycle < Vehicle
end

在数据表中添加一个type字段作为标记,表示该记录属于哪种子类。可以在迁移文件中添加如下代码:

create_table :vehicles do |t|
  t.string :type
  # ...
end
使用模型

在使用这些模型时,可以像普通的 ActiveRecord 模型一样使用它们:

car = Car.new
car.color = 'red'
car.save

motorcycle = Motorcycle.new
motorcycle.color = 'blue'
motorcycle.save

当从数据表中加载记录时,会根据type字段的值自动创建相应的子类实例,例如:

vehicles = Vehicle.all
vehicles.each do |vehicle|
  puts "#{vehicle.type}: #{vehicle.color}"
end

这将输出所有车辆的类型和颜色。

注意事项
  • 标记字段type必须存在,它指定了记录对应的子类类型。
  • 各个子类的属性必须在基类中定义,并且基类中不能将其设置为attr_accessible或者attr_protected
  • 除了id字段之外,继承模型中不能含有两个以上的主键。
  • 基类模型必须设置为抽象类,否则会尝试创建相应的数据表,但是这个表中不包括任何记录。

使用 STI 可以简化代码,同时也便于扩展和维护。希望你在使用 Rails 开发时能够运用 STI 来优化你的设计。