在ActiveRecord中覆盖继承的after_save函数

问题描述 投票:0回答:1

假设我有一个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

但是这似乎是一个糟糕的解决方案。

ruby-on-rails ruby rails-activerecord
1个回答
0
投票

您可以使用STISingle 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

© www.soinside.com 2019 - 2024. All rights reserved.