假设我有一个Active Record类,带有after_save
方法,例如:
class Vehicle < ActiveRecord::Base
after_save :wheel_count
def wheel_count
puts 4
((我知道这是较差的设计;这只是一个示例)
而且我有一个此类的子类,我想用它重写after_save
方法:
class Boat < Vehicle
def wheel_count
puts 0
但是,似乎未调用子函数。有没有一种方法可以根据实例动态选择after_save
函数?我想我可以按照以下方式做一些事情:
after_save :after_save_handler
def after_save_handler
wheel_count
但是这似乎是一个糟糕的解决方案。
您可以使用STI
或Single Table Inheritance执行此操作。
活动记录通过将类的名称存储在默认情况下名为“类型”的列中(可以通过覆盖Base.inheritance_column进行更改)来允许继承。这意味着继承看起来像这样:
class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end
[当您执行
Firm.create(name: "37signals")
时,该记录将以类型=companies
的形式保存在“Firm”
表中。然后,您可以使用Company.where(name: '37signals').first
再次获取该行,它将返回Firm
对象。
您可以轻松地在子类中覆盖父类方法,并且在调用这些方法时,它们会根据对象的类型进行响应。您可以在这里详细阅读-Single Table Inheritance