Rails 3 Observer - 希望学习如何为多个模型实现Observer

时间:2010-10-01 02:20:36

标签: ruby-on-rails ruby-on-rails-3

我有以下观察员:

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

  def after_create(record)
  end
end

我想学习怎么做是在after_create中添加一个SWITCH / IF语句,所以我知道创建了哪个模型

类似的东西:

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

或更容易想象:

if record == 'Photo'

如何记录并确定型号名称?

2 个答案:

答案 0 :(得分:3)

在评论中,我注意到您发现这可以使用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#===

===ClassObject

中的实施方式不同

答案 1 :(得分:1)

您需要为单独的模型设置单独的观察者

所以对于User =&gt; UserObserver,Photo =&gt; PhotoObserver

您需要告诉rails应用程序使用哪些观察者,您在config / environment.rb中指定

至少这是标准方式。有关详细信息

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