为Oracle和Ruby on Rails添加标签(一)

日期: 2007-12-04 作者:Matt Kern 来源:TechTarget中国

  在过去的几年里,社会计算席卷了互联网,而这个趋势的特征之一就是“标签”的概念。标签虽然算不上是新概念,但它最新的应用具有新颖性 – 至少对于 Web 应用程序领域是这样的。共享标签数据让最新一轮 Web 应用程序的用户以前所未有的方式搜索和共享数据。

  标签本身并不会给您的 Rails 应用添加惊人的功能,但是您在标签基础上构建的特性会给您的用户增加一层丰富的体验。您会发现自己很快就沉迷于那些利用少量简单字符串的新特性了。

  本文将介绍使用 acts_as_taggable_on_steroids 插件为您的站点添加标签功能是何等的简单。

  混淆泛滥

  信不信由你,为您的 Rails 应用添加标签最棘手的地方在于确定使用哪个库。实现 acts_as_taggable 概念有多种竞争性的方法。截止到本文写作之际,至少有四种宣传过的在 Rails 应用中实现标签的方法:

  acts_as_taggable gem
  acts_as_taggable 插件
  acts_as_taggable_on_steroids 插件
  has_many_polymorphs 插件

  下面,让我们来逐个查看这些方法并试着理清一个非常混乱的情形。

  acts_as_taggable gem。 这个 gem 是为 Rails 编写的首个实现,因此,它实际上针对的是比 1.0 更老的版本。它对当前的 Rails 版本(1.1,1.2 以及 Edge Rails -“Edge Rails”是运行最新的或是顶级版本 Rails 时所用的一个新奇术语)仍有效。该 Gem 有一个十分致命的弱点,因此在 Rails 应用中不会被采用。它要求为您想要添加标签的每个模型提供一个单独的连接表。但是,如果您只想要为一个模型添加标签,这可能是最简单的方法。虽然您可以为多个模型添加标签,但需要为添加标签的每个模型创建一个单独的连接表和关联,这样就大大增加了开销。

  acts_as_taggable 插件。 此插件(相对于 gem)是由 Rails 的创建者 (David Heinemeier Hanson) 编写的。它的实现采用了 Rails 较新版本中一些更高级的特性,如 :has_many_through 和多态关联。它有个良好的开端,但是 Hanson 自己却承认该插件尚不成熟,而且 Rails 核心团队已经决定不应用由 Rails 社区提交的大量补丁。(据我所知,甚至还有一个报告的 SQL 注入漏洞在官方版中没有解决。)然而,它可能是最容易安装和使用的实现,您也许会有兴趣了解。它可以通过 Rails SVN 服务器直接访问,所以您只需要调用

  $ script/plugin install acts_as_taggable

  遗憾的是,据 Rails 核心开发人员讲,此插件的目的仅在于概念验证,它存在不少问题。

  acts_as_taggable_on_steroids plugin。 尽管从这个插件的名称上看好像它是在原先 acts_as_taggable 插件之上构建的附加功能,但事实并非如此。它是对原先插件的重写,而且确实添加了测试和一些额外功能。最让人疑惑不解的是 acts_as_taggable gem 的原作者发布了一篇名为"Tagging on Steroids with Rails"的网志。哟!(我们将关注这个插件,因为“官方的”Rails 插件不是用于生产的。)

  has_many_polymorphs 插件。 has_many_polymorphs 在同类中相对年轻,它是个更抽象、非常强大的插件,可用于给模型添加标签,尽管它并不是专门为此目的构建的。以后我们再介绍 has_many_polymorphs 插件解决的一些问题;现在,我想要介绍的是 acts_as_taggable_on_steroids,因为它对于 Rails 的开发新手来说更简明、更易用。多态关联是 Rails 的高级内容,尽管在 acts_as_taggable_on_steroids 插件中有大量应用,但不必完全理解它们。

  安装

  首先,阅读我的文章 “Ruby on Rails 移植指南”。通过这篇文章,您会了解如何利用 Rails Migrations 为一个叫做 Discographr 的在线社会音乐编目应用程序创建数据库模式。下文都以此应用程序为基础。

  我们先试验 acts_as_taggable_on_steroids 插件。官方 Rails SVN 不包含这个插件,因此您要先找到它。Rails 有一个便捷的 script/plugin 命令,可以帮您找到该插件:

  $ script/plugin discover -l | grep viney

  http://svn.viney.net.nz/things/rails/plugins/

  插件发现脚本搜索 wiki.rubyonrails.org/rails/pages/Plugins wiki 页面,获得所有已知的插件信息库。现在将信息库添加到您的已知源列表:

  $ script/plugin source http://svn.viney.net.nz/things/rails/plugins/

  这能让您执行异常简单的命令:

  $ script/plugin install acts_as_taggable_on_steroids

  已经完成了:

  $ script/plugin install

  http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids/

  然而,如果 Rails 在其他项目中已知此信息库,则会更简单。(您还可以使用一个称为 rapt 的工具搜索和下载插件。可在 RubyForge 找到此工具。)

  快速浏览并确定已将插件安装到 RAILS_ROOT/vendor/plugin 目录下。

  然后,您需要更改数据库使其支持该插件并允许您为模型添加标签。您可使用 Migrations 完成这项工作,就像在“Ruby 大移植”中所述那样):

  $ script/generate migration AddTags

  exists db/migrate

  create db/migrate/004_add_tags.rb

  接着编辑您刚创建的移植文件 004_add_tags.rb,将以下代码添加到 self.up 方法中:  

def self.up
  create_table :tags do |t|
  t.column :name, :string
  end
  create_table :taggings do |t|
  t.column :tag_id, :integer
  t.column :taggable_id, :integer
  t.column :taggable_type, :string
  t.column :created_at, :datetime
  end
  end

  这次移植添加了两个表。第一个表为 tags,它存放实际的标签名称。第二个表将这些标签与一个模型关联起来。该插件使用 taggable_type 字段做表名(利用 Rails 标准的复数化和单数化神奇功能),并按主键查找目标。还可以告诉你的是,该移植直接出自该插件自带的测试。测试是 acts_as_taggable_on_steriods 插件向 DHH 版本添加的几个特性之一。

  查看 RAILS_ROOT/vendor/plugins/acts_as_taggable_on_steroids/test,您就能找到为该插件编写的所有测试。测试不仅起到很好的安全网的作用,还能让您自由地修改代码(知道您经常运行 rake 测试发现缺陷),此外还提供了库的典型使用案例。这就像写入文档中一样好用!因此,通过查看 test 目录下的 schema.rb 文件,您就知道插件需要什么才能使用了。

  接下来,您需要运行移植真正将所需的表添加到模式中:

  $ rake db:migrate

  (in /Users/mattkern/dev/discographr)

  == AddTags:migrating =========================================================

  – create_table(:tags, {:force=>true})

  -> 0.7773s

  – create_table(:taggings, {:force=>true})

  -> 1.0804s

  == AddTags:migrated (1.8754s) ===============================================

  搞定,就这么简单。现在您就可以给模型添加标签了。

  玩转标签

  现在是使用新增功能的时候了。首先您需要给模型添加一个 acts_as helper。因为希望 Discographr 中所有的模型都可添加标签,所以您需要给每个模型添加一行。Rails 利用 acts_as helpers 添加功能或扩展 ActiveRecord::Base 类和子类。举例来说,acts_as_taggable 在一个调用中为您的模型添加标签功能(理论上的),而 acts_as_tree 为您的模型添加层级树功能。从给 Artist 模型添加标签开始。  

class Artist < ActiveRecord::Base
  acts_as_taggable
  end

  这个简单的声明为 Artist 模型添加了大量功能。它首先是用 Taggings 和 Tags 模型创建 :has_many 关系。但您会说“等等”。您还没定义这些模型呢!这就是使用插件的特性之一。在 plugin 目录下查看最新安装的插件,您会看到两个模型文件 tag.rb 和 tagging.rb。通过将这些模型放在插件的 lib 目录下而将其包含到应用程序中。但是,在这里我是还要提出一个警告:虽然在插件中定义模型很方便,但这也会产生问题。因为这样做可能会与所包含的应用程序模型发生冲突。

  如果您以前使用过 Rails,您就会知道 :has_many、:has_one 和 :has_and_belongs_to_many 方法会为您的模型添加许多方法。由于插件依赖 :has_many 方法和多态关联,因此可以通过将模型声明为 acts_as_taggable 获得所有功能。稍后您会看到添加的这些方法的使用情况。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐