在过去的几年里,社会计算席卷了互联网,而这个趋势的特征之一就是“标签”的概念。标签虽然算不上是新概念,但它最新的应用具有新颖性 – 至少对于 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中国
作者
相关推荐
-
Ruby On Rails实践现状调查结果
在这篇文章里,我们将与读者一起看一下部分Ruby调查结果,使大家对Ruby编程技术的现状有一个良好的认识。
-
开源市场仍存在大量就业机会
从脚本编程语言到开源服务器操作系统,再到移到应用开发人员,开源仍持续在为求职者提供着就业机会。
-
应用安全测试:双面的黑盒
软件安全的最大风险是检验工具及过程不透明的本质,以及不同的检验技术(例如自动化动态测试)不能覆盖假阴性错误的潜在可能性。
-
建设DevOps能力 实现业务敏捷
当软件行业进入互联网时代,为了满足这些要求,IT组织需要强有力的流程、技术和人员作为保障。