Совершенный код

ruby on rails best practicies

Active Record Observers

В обсерверы стоит выносить нотификации, взаимодействие с внешними системами (отправка в твиттер и т.п.), отправка сообщений в очередь, логирование, в общем все что касается оповещений и инфраструктуры. При этом не стоит выносить в обсерверы все что связано с изменением состояния ваших моделей, воспользуйтесь для этого, хотя бы, колбеками. Проверить нужно ли использовать обсервер или нет, достаточно просто, так если при его отключении нарушится консистентность данных, скорее всего этому коду там не место.

Существует стандартная практика именования обсерверов по имени модели: UserObserver. Это, скорее всего, приведет к тому что на каждую сущность будет по одному обсерверу, который включит в себя все что только можно. Это прямое нарушение single responsibility principe. Одной из последующих проблем станет невозможность отключить какой-то аспект, например, отправку сообщений в очередь в тестовом окружении. Придется выключать весь обсервер или переписывать код. Намного лучше, все же, делить обсерверы по решамым ими задачам. Если есть необходимость отправлять письма при изменении состояния пользователя, то стоит создать UserNotificationObserver в котором сосредоточить всю логику отправки пользовательских нотификаций.

Пример:

app/observers/person_elastic_observer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class PersonElasticObserver < ActiveRecord::Observer
  observe :person

  def after_save(person)
    person.broadcasts.each do |b|
      b.tire.update_index
    end
  end

  def after_destroy(person)
    person.broadcasts.each do |b|
      b.tire.update_index
    end
  end
end

Обсерверам не место рядом с моделями. Удобнее всего их хранить в папке app/observers.

Comments