📅  最后修改于: 2023-12-03 15:19:41.664000             🧑  作者: Mango
在 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 来优化你的设计。