Rails Activerecord观察者无法正常工作

时间:2012-02-23 07:23:18

标签: ruby ruby-on-rails-3 activerecord observer-pattern

在rails 3.1 app中, 我正在尝试创建一个可观察的activerecord观察者,但似乎它不起作用 即使只创建activerecord观察者而没有可观察的,after_create 如果未调用event,则永远不会打印出“after after event”字符串。 调用者是一个佣金任务。

这是代码示例,以便明确。

class PostTemp < ActiveRecord::Base  

end


class PostTempObserver < ActiveRecord::Observer
  include Observable
  attr_reader :new_data

  def initialize
    @new_data = 0
  end

  def after_create(record)
    #binding.pry
    puts "in after create event"
    @new_data = 1
    notify_observers(@new_data)
    @new_data = 0
  end

  def reset_new_data
    @new_data = 0
  end

end


class Notifier  
  attr_reader :total_new_data

  def initialize(model_observer)
    model_observer.add_observer(self)
    @total_new_data = 0
  end

  def update(new_data_flag)
    @total_new_data = @total_new_data + new_data_flag
  end

  def perform
    if @total_new_data > 0
      #send notification
      puts "notify to  bar app..."    
      @total_new_data = 0
    else
      puts "no new data"  
    end

  end

end

#in config/application.rb
config.active_record.observers = :post_temp_observer
在task1.rake中

namespace :foo do
  desc "crawl message and notify if there's new data"
  task :get_message => :environment do
   post_temp_observer = PostTempObserver.instance
   notifier = Notifier.new(post_temp_observer)
    #..
    #do some crawling
    #..

  notifier.perform

  end

end

1 个答案:

答案 0 :(得分:0)

我自己想通了。 我需要在PostTempObserver中添加 super 已更改

 class PostTempObserver < ActiveRecord::Observer
   include Observable
   attr_reader :new_data


   def initialize
     super
     @new_data = 0
   end

   def after_create(post_temp)
     @new_data = 1
     changed
     notify_observers(@new_data)
     @new_data = 0
   end

   private
   def reset_new_data
     @new_data = 0
   end

 end
相关问题