`
hot88zh
  • 浏览: 182805 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于ActiveRecord::Observer

阅读更多

Observer 类会对外部的原始类内在生命周期内实现触发行为的“回调”做出反应。当一个“模型”类担负了不是它的核心职责的功能时,使用这种方式就会减少混乱。

 

从上面说明中可以看出,Observer 类是对Callbacks 类的一种变相的补充。补充的原因是因为有些“模型”为了迁就Callbacks 而做了自己不该做的事。而Observer 类就是把原来要写在“模型”中的Callbacks 的方法抽取出来,并在类中指出它要监视这个“模型”对象与Callbacks 有关的活动。

Observer 允许你注入行为到“模型”类中,而不用修改这些类内的任何代码。

一个“观察者”显示地连接本身到一个“模型”类中,为了回调注册它自己为“模型”的一部分,但是并不要求“模型”本身做任何更改。

例如:

class CommentObserver < ActiveRecord::Observer

def after_save(comment)

Notifications.deliver_comment("admin@do.com",

"New comment was posted", comment)

end

end

Comment#save 执行完成时,这个Observer 发送一个电子邮件。

class ContactObserver < ActiveRecord::Observer

def after_create(contact)

contact.logger.info('New contact added!')

end

def after_destroy(contact)

contact.logger.warn("Contact with an id

of #{contact.id} was destroyed!")

end

end

这个Observer 在指定的回调被触发时,使用logger 来日志。

ActiveRecord::Observer 被子类化时,它查看新类名字,从尾部剥去单词Observer ,并且假设左侧是被观察的“模型”类的名字。在我们的例子中,我们称我们的“观察者”类为ContactObserver ,所以它自动地把它自己同“模型”Contact 钩住。

一、观察不能被推断的类

缺省地,Observer 映射与其共享同一名字的类。所以CommentObserver 会与“观察者”Comment 紧密联在一起,ProductManagerObserverProductManager ,等等。如果你想有与你观察的类不同的名字的Observer ,你可以使用Observer.observe 类方法。

也就是说,Observer 类可以使用observer() 方法明确地列出了它想观察的“模型”。

class AuditObserver < ActiveRecord::Observer

observe Account

def after_update(account)

AuditTrail.new(account, "UPDATED")

end

end

如果audit “观察者”需要观察多个种类的对象,这可以指定多个参数:

class AuditObserver < ActiveRecord::Observer

observe Account, Balance

def after_update(record)

AuditTrail.new(record, "UPDATED")

end

end

现在,AuditObserver 将对AccoutBalance ,它们约定的record 的更新做出反应。

二、利用回调方法

Observer 可以为Callbacks 模块内描述的每个方法实现回调方法。

三、存储ObserverRails

如果你在Rails 内使用了“活动记录”,则Observer 类通常以app/models/audit_observer.rb 名字约定被存储在app/models 目录内。

四、配置

为了激活一个Observer ,你需要在config/environment.rb 文件内设置config.active_record.observers 配置。

config.active_record.observers = :comment_observer,

:signup_observer

除非你在你的应用程序配置中定义这些,否则Observer 将不会被调用。

也就是说,我们必须创建一个“观察者”实例—只定义“观察者”类是不能完成观察的。对标准的“活动记录”应用程序来说,你还需要在初始化期间,在某些方便的地方调用instance() 方法。如果你写一个Rails 应用程序,你将在你的ApplicationController 内使用observer 指令,

五、Observer 生成器

在提示符窗口输入script/generate observer User ,可以在app/models 目录下创建一个UserObserver 框架。

分享到:
评论

相关推荐

    Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序-Ruby开发

    Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序。 描述Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序。 入门Ruby 2.6.0和更高版本上的ActiveRecord 4.2+支持...

    otr-activerecord:离轨

    主动记录一种轻松使用ActiveRecord的简便方法。 可与Grape,Sinatra,普通的旧机架甚至是无聊的小脚本一起使用!。 默认值都是非常Railsy的( config/database.yml , db/seeds.rb , db/migrate等),但是您可以...

    ActiveRecord简单实例_activerecord.zip

    在创建一个ActiveRecord模型时,通常会定义一个继承自`ActiveRecord::Base`的类。例如,如果我们有一个`users`表,我们可以创建一个`User`类: ```ruby class User &lt; ActiveRecord::Base end ``` 这个简单的定义就...

    stateful_enum:基于ActiveRecord :: Enum构建的非常简单的状态机插件

    stateful_enum是建立在ActiveRecord的内置ActiveRecord :: Enum之上的状态机gem。 安装 将此行添加到您的Rails应用程序的Gemfile中: gem 'stateful_enum' 和捆绑。 动机 您不需要抽象 stateful_enum取决于...

    rails_async_migrations:对ActiveRecord :: Migration的异步支持

    RailsAsyncMigrations ActiveRecord::Migration扩展程序以一种简单直接的方式使您的迁移异步。动机创建该库的目的是为了帮助在技术水平上难以扩展的小型公司。 小型项目不需要异步迁移队列,大公司在遇到扩展问题时...

    activerecord-jwt

    ActiveRecord :: Jwt 此ActiveRecord扩展添加了jwt(JSON Web Token)方法 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-jwt' 然后执行: $ bundle 或将其自己安装为: $ gem install ...

    userstamp, 这个 Rails 插件扩展ActiveRecord.zip

    userstamp, 这个 Rails 插件扩展ActiveRecord Userstamp插件( v-2.0 )概述Userstamp插件扩展了 ActiveRecord::Base,以添加对'创建者','更新程序'和'deleter'属性的自动更新。 它是基于 ActiveRecord::Timesta

    loofah-activerecord:使用丝瓜络和Nokogiri消毒ActiveRecord

    丝瓜络活动记录 地位系统地位大堂CI 代码气候 版眼描述loofah-activerecord将loofahHTML清理功能扩展到Rails ActiveRecord模型中。 在以下查看有关loofah更多信息: : 特征丝瓜络activerecord包含两个ActiveRecord...

    rgeo-activerecord:RGeo ActiveRecord扩展和用于空间连接适配器的工具

    RGeo :: ActiveRecord是一个可选的模块,它为ActiveRecord提供空间扩展,以及一组用于基于RGeo编写空间ActiveRecord适配器的帮助程序。 概括 RGeo是使用Ruby编程语言编写位置感知应用程序的关键组件。 其核心是行业...

    activerecord-commentator:将caller_location(文件名,行号和方法名)添加为SQL注释

    ActiveRecord :: Commentator ActiveRecord :: Commentator将caller_location (文件名,行号和方法名)添加为调用SQL语句SQL注释。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-commentator'...

    php-activerecord:PHP的ActiveRecord实现

    什么是ActiveRecord的简要概述: 活动记录是一种访问数据库中数据的方法。 数据库表或视图被包装到一个类中,因此对象实例被绑定到表中的一行。 创建对象后,保存后会将新行添加到表中。 任何加载的对象都从数据库...

    wp-activerecord:WordPress 的 ActiveRecord 实现

    WordPress ActiveRecord WordPress ActiveRecord 实现了可以轻松地检索、更新和删除数据库表的行,而无需费力处理原始 SQL 查询字符串。 这个库的目标是为 CMS WordPress 提供一个小而强大的 ,它应该很容易实现。 ...

    ROR绿色最新环境(2013/3/10)

    ActiveRecord::ConnectionAdapters::ConnectionManagement ActiveRecord::QueryCache ActionDispatch::Cookies ActionDispatch::Session::CookieStore ActionDispatch::Flash ActionDispatch::ParamsParser ...

    activerecord-collections:创建记录集合,由 ActiveRecord 表示

    最好将ActiveRecord::Collection描述为介于模型(从ActiveRecord::Base扩展而来)、 ActiveRecord::Relation和可枚举的记录集之间的某处。 集合包装并委托给上述对象,在需要时(并且尽可能不频繁地)在发送方法调用...

    activerecord-mysql-unsigned:启用使用整数类型中的“ unsigned”选项来迁移ActiveRecord

    5.0 &gt; ActiveRecord::VERSION &gt;= 3.2 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-mysql-unsigned' 然后执行: $ bundle 或将其自己安装为: $ gem install activerecord-mysql-unsigned ...

    neo4apis-activerecord:Ruby宝石,使用activerecord将SQL数据导入neo4j

    neo4apis-activerecord 将数据从PostgreSQL / mySQL / sqlite复制到Neo4j的最简单,最快的方法 如何运行: 没有现有的ActiveRecord应用程序: neo4apis activerecord all_tables --identify-model --import-all-...

    scala-activerecord:Scala的类似于ActiveRecord的ORM库

    Scala ActiveRecord scala-activerecord是Scala的ORM库。 该库的灵感来自Ruby on Rails的ActiveRecord。 它是按照CoC(配置公约),DRY(请勿重复自己)的原则设计的。 最小的例子 样本片段: 模型实施: ...

    activerecord-typedstore:活动记录

    ActiveRecord :: TypedStore 但具有类型化的属性。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-typedstore' 然后执行: $ bundle 或将其自己安装为: $ gem install activerecord-...

    ActiveRecord:就像 Swift 上的 ActiveRecord

    Swift 的活动记录 操作核心数据的简单方法。 该库的灵感来自活动记录模式,这是一种易于操作数据库的设计模式。 要求 Xcode 6.3 ...ActiveRecord需要包含NSManagedObjectContext Context ,以便在

    association_callbacks:ActiveRecord关联的回调

    ActiveRecord :: Base has_many :comments end class Comment &lt; ActiveRecord :: Base belongs_to :article end 然后,您通常需要将Comment内容反规范化为Post ,反之亦然。 这是在帖子上反规范last_comment_...

Global site tag (gtag.js) - Google Analytics