在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
答案 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