Как продлить "сохранить!" метод по ActiveRecord? - PullRequest
2 голосов
/ 29 декабря 2011

У меня есть несколько моделей, которые в настоящее время расширяют ActiveRecord :: Base.

Для всех этих моделей я хочу расширить метод save! с некоторыми дополнительными функциями.Например,

def save!
  begin
    super
  rescue 
    # additional exception handling logic
  end
end

Каков идеальный способ сделать это в режиме ООП?

Я попытался создать подкласс ActiveRecord (MyActiveRecord) и использовал приведенный выше код в подклассе.Затем я использовал подкласс в качестве родительского класса для всех моих моделей.Но затем ActiveRecord пытается найти таблицу myapp_test.my_active_records.

Есть ли более элегантный способ использования модулей, позволяющий добиться того же самого?

1 Ответ

1 голос
/ 29 декабря 2011

Если вы пометите класс как абстрактный:

class Foo < ActiveRecord::Base
  self.abstract_class = true
end

, тогда вы можете создать из него подкласс, и рельсы не будут искать таблицу foos.

В этом конкретном случае я бы не сталНе перезаписывайте сохранение, хотя - уже есть набор обратных вызовов (around_save, around_update и т. д.), которые, вероятно, имеют больше смысла.

Даже если вы сделаете это, переписав метод save, это может привести кболее разумно сделать это, поместив перезаписанный метод сохранения в модуль и включив этот модуль в классы, которым он требуется.

module MySave
  def save!
    super
  rescue
  ...
  end
end

class MyClass < AR::Base
  include MySave
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...