Rails 3 Observer - вы узнаете, как реализовать Observer для нескольких моделей - PullRequest
1 голос
/ 01 октября 2010

У меня есть следующий наблюдатель:

class NewsFeedObserver < ActiveRecord::Observer
  observe :photo, :comment

  def after_create(record)
  end
end

Что бы я хотел узнать, как это сделать, это добавить оператор SWITCH / IF в after_create, чтобы я знал, какая модель была создана

Что-то вроде:

after_create(record)
switch model_type
case "photo"
 do some stuff
case "comment"
 do some other stuff
end

Или проще визуализировать:

if record == 'Photo'

Как я могу сделать запись и определить название модели?

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

В комментарии я заметил, что вы нашли, что это работает, используя record.class.name, но это не очень идиоматичный Ruby.В операторе Ruby case для сравнения используется ===, который отлично подойдет вам, если вы правильно его реализуете.

class NewsFeedObserver < ActiveRecord::Observer
  observe :photo, :comment

  def after_create(record)
    case record
      when Photo
        # do photo stuff
      when Comment
        # do comment stuff
      else
        # do default stuff
    end
  end
end

По сути, это преобразуется в:

if Photo === record
  # do photo stuff
elsif Comment === record
  # do comment stuff
else
  # do default stuff
end

Советую отметить следующее:

class Sample
end

s = Sample.new

Foo === s   # true   uses Class#===
s === Foo   # false  uses Object#===

=== реализован по-разному в Class и Object

1 голос
/ 01 октября 2010

Вам нужно настроить отдельных наблюдателей для отдельных моделей

Так для User => UserObserver, Photo => PhotoObserver

Вам нужно указать приложению rails, какие наблюдатели использовать, которые вы укажетев config / environment.rb

По умолчанию это стандартный способ.Для более подробной информации

http://guides.rubyonrails.org/active_record_validations_callbacks.html#observers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...