Переопределение унаследованной функции after_save в ActiveRecord - PullRequest
0 голосов
/ 02 марта 2020

Предположим, у меня есть класс 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

, но это кажется плохим решением.

1 Ответ

2 голосов
/ 02 марта 2020

Вы можете сделать это, используя STI или Наследование одной таблицы .

Active Record позволяет наследовать, сохраняя имя класса в столбце, который по умолчанию называется «тип» (можно изменить, перезаписав 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.

Вы можете легко переопределить методы родительского класса в дочернем классе, и когда эти методы вызываются, они отвечать в зависимости от типа объекта. Вы можете подробно прочитать здесь - Наследование одной таблицы

...