`

Acts As Taggable On Steroids

阅读更多
参考着mephisto写blog程序,第一次看到[].collect(&:name)的写法,别笑我……书上没见过,代码又写得少,结果就是这样。
=============================================
答案在这里:http://www.infoq.com/cn/articles/ruby-open-classes-monkeypatching


主要记录一下acts_as_taggable_on_steroids的用法。
http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids

首先,安装这个插件到项目中:
ruby script/plugin install git://github.com/jviney/acts_as_taggable_on_steroids.git

使用
接着,执行:
ruby script/generate acts_as_taggable_on_steroids_migration
会生成如下migration代码:
class ActsAsTaggableMigration < ActiveRecord::Migration

  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

      # You should make sure that the column created is
      # long enough to store the required class names.
      t.column :taggable_type, :string
      t.column :created_at, :datetime
    end
    add_index :taggings, :tag_id
    add_index :taggings, [:taggable_id, :taggable_type]
  end

  def self.down
    drop_table :taggings
    drop_table :tags
  end
end

这里建了两个表,tag表和taggings表。taggings表看着像是个多对多的连接表,另外多了个taggable_type字段,估计是要做成不同类型的taggable对象都能通用的吧。
然后……只要在需要tag的类里边加一句acts_as_taggalbe的调用就可以了……自己不用插件瞎搞了大半天的东东,两三个命令加一句代码解决了。嗯?居然没有Tag类,估计隐藏在插件内部了。grep一下:
grep 'class Tag' ./ -r
果然……
引用
./vendor/plugins/acts_as_taggable_on_steroids/lib/tag.rb:class Tag < ActiveRecord::Base


继续贴代码。
class Article < ArticleContent
	acts_as_taggable
	belongs_to :user
	has_many :comments
end


ruby script/console

#加上acts_as_taggable的类会自动加上tag_list的accessor
a=Article.new
#writer只需要逗号分隔的字符串作参数
a.tag_list="tag1,tag2,tag3"
#reader返回的是字符串数组。
a.tag_list #=> ["tag1","tag2","tag3"]
a.save
#可以用taggable类(这里即Article类)的类方法find_tagged_with来查找
#拥有某个指定tag的所有Article对象
articles=Article.find_tagged_with 'tag1' #=> [#<Article id: 2, title: nil, hits: nil, user_id: nil, created_at: "2010-01-19 17:10:05", updated_at: "2010-01-19 17:10:05", content: nil, type: "Article">]

#By default, find_tagged_with will find objects that have any of the given tags. 
#To find only objects that are tagged with all the given tags, use match_all. 
articles=Article.find_tagged_with 'tag1,asdf' #=> [#<Article id: 2, title: nil, hits: nil, user_id: nil, created_at: "2010-01-19 17:10:05", updated_at: "2010-01-19 17:10:05", content: nil, type: "Article">]
articles=Article.find_tagged_with 'tag1,asdf', :match_all=>true #=> []
articles=Article.find_tagged_with 'tag1,tag2', :match_all=>true #=> [#<Article id: 2, title: nil, hits: nil, user_id: nil, created_at: "2010-01-19 17:10:05", updated_at: "2010-01-19 17:10:05", content: nil, type: "Article">]


还有个tag_counts方法,可以这样调用:
Article.tag_counts

还可以这样:
user.articles.tag_counts


标签云(云到底是什么概念?)可以这么玩:
首先把一个Helper的Module include到ApplicationHelper中
  module ApplicationHelper
    include TagsHelper
  end

示例:
Controller:
  class PostController < ApplicationController
    def tag_cloud
      @tags = Post.tag_counts
    end
  end

View:
  <% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %>
    <%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
  <% end %>

CSS:
  .css1 { font-size: 1.0em; }
  .css2 { font-size: 1.2em; }
  .css3 { font-size: 1.4em; }
  .css4 { font-size: 1.6em; }

缓存
为了减少查询数据库的次数,可以给taggable对象增加一个字段,用来存放所有的标签列表(以字符串形式),字段名为cached_tag_list:
  class CachePostTagList < ActiveRecord::Migration
    def self.up
      add_column :posts, :cached_tag_list, :string
    end
  end

  class Post < ActiveRecord::Base
    acts_as_taggable

    # cached_tag_list是默认的字段名,也可以换一个名字:
    # set_cached_tag_list_column_name "my_caching_column_name"
  end

最后是分隔符
默认的分隔符是半角逗号“,”,这个值也可以改,比如说改成空格:
TagList.delimiter = " "
分享到:
评论
5 楼 同一片天空 2011-12-17  
请问Css代码 
.css1 { font-size: 1.0em; } 
.css2 { font-size: 1.2em; } 
.css3 { font-size: 1.4em; } 
.css4 { font-size: 1.6em; } 放在什么地方 新手不是很懂
4 楼 javafansmagic 2011-10-20  
呵呵 这内容是github上的翻译。不错
3 楼 yuan 2010-02-24  
2楼的问题见这篇博客的3楼:http://yuan.iteye.com/blog/575801#comments
2 楼 yuan 2010-01-20  
嗯,发现一个问题:
a=Article.new
a.tag_list="tag1,tag2"
a.save

这时候tags表有2条数据:tag1和 tag2
如果articles表有缓存的话,缓存应该是“tag1,tag2”
然后:
a.tag_list="tag3,tag4"
a.save

这时候tags表按理来说应该只剩下tag3、tag4两条数据,但结果不是这样的,tag1和tag2仍然保留着。
如果articles表有缓存,缓存应该是“tag3,tag4”,查了一下,这个倒是没有错了。
看来在更新tag_list的时候,少了一步检查,检查没有被引用的tags,删除之。
1 楼 yuan 2010-01-20  
搜索了一下输出SQL到控制台的方法,找到这里:
http://bxp.iteye.com/blog/149459
稍微改一下,在environment.rb中加入如下代码:

if RAILS_ENV=='development'
  config.log_level = :debug  
  config.active_record.schema_format = :sql  
  config.logger = Logger.new(STDERR) 
end

相关推荐

    acts_as_list.rar

    acts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_list.raracts_as_...

    acts-as-taggable-array-on:使用PostgreSQL数组的Rails一个简单而高性能的标记gem

    gem "acts-as-taggable-array-on" 然后执行: bundle 设置 要使用它,您需要具有一个数组列以充当taggable- tags 。 class CreateUser &lt; ActiveRecord :: Migration def change create_table :users do | t...

    acts_as_list, 用于管理列表的ActiveRecord插件.zip

    acts_as_list, 用于管理列表的ActiveRecord插件 ActsAsList描述这个 acts_as 扩展提供了对列表中的多个对象进行排序和重新排序的功能。 具有指定的类的类需要在映射的数据库表上定义为整数的position 列。 0.8.0升级...

    acts_as_category:想想acts_as_tree +权限

    #ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...

    ruby on rails 相关lib

    ruby on rails 相关lib 其中包含:rspec flexmock acts_as_taggable-2.0.2 widgets acts_as_list classic_pagination

    acts_as_authenticated

    NULL 博文链接:https://moyuan.iteye.com/blog/263902

    Api-acts_as_api.zip

    Api-acts_as_api.zip,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...

    active_record-acts_as, 模拟activerecord模型的多表继承.zip

    active_record-acts_as, 模拟activerecord模型的多表继承 插件开发已经移动这个项目的积极发展已经转移到了的krautcomputing fork 。... ActiveRecord::ActsAs这是对 acts_as_relation的重构。模拟用于Acti

    acts_as_paranoid:ActiveRecord插件可让您隐藏和还原记录,而无需实际删除它们

    使徒行传 一个Rails插件来添加软删除。...用法安装gem: gem 'acts_as_paranoid' , '~&gt; 0.7.0' bundle install创建迁移bin/rails generate migration AddDeletedAtToParanoiac deleted_at:datetime:index启用ActsAs

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    acts_as_restful_list:就像acts_as_list一样,但很安静

    acts_as_restful_list 就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都...

    acts_as_liked:向任何 Active Record 模型添加类似功能

    gem 'acts_as_liked' 然后执行: $ bundle 运行生成器: $ rails generate acts_as_liked 并且不要忘记迁移您的数据库 $ rake db:migrate 用法 可爱的模特 将acts_as_likeable添加到任何模型,它的实例可以被...

    acts_as_owner.rb:Rails 的简单所有权解决方案

    Acts as owner 是 Ruby on Rails 的一个插件,它为所有者对象提供了自我查询可拥有对象的所有权的能力。 可拥有对象可以是属于所有者对象的任何对象和属于可拥有对象的任何对象。 属于拥有的可拥有的父代的任何可...

    acts_as_aliased:扩展 ActiveRecord

    gem 'acts_as_aliased' 更新包后,运行 rails generate acts_as_aliased:install rake db:migrate 这将创建一个新表aliases 。 用法 假设您有一个需要别名的模型Company ,因为公司名称有不同的版本。 使用acts_as...

    acts_as_paranoid

    NULL 博文链接:https://moyuan.iteye.com/blog/263853

    acts_as_privilege.rb:Rails 的简单权限解决方案

    Acts as privilege 是 Ruby on Rails 的一个插件,它提供了将控制器操作限制为特权资源的功能。 这种基于 ACL 的安全模型被设计为基于角色的访问控制,其中每个角色可以是一组用户。 地位 哲学 只做一件事的通用库...

    On n-principally weakly injective acts over monoids

    关于幺半群上的n-主弱内射系,乔虎生,马鑫,设n是正整数. 本文中定义了一类新的内射性, 即n-主弱内射性. 该内射性是主弱内射性的推广. 称幺半群S是n-正则的,如果对任意的s∈S, s n�

    actions_as_commentable:ActiveRecord acts_as_commentable插件

    gem 'acts_as_commentable' Rails gem 'acts_as_commentable' , '3.0.1' Rails gem 'acts_as_commentable' , git: 'git@github.com:jackdempsey/acts_as_commentable.git' , branch: '2.x' 生成器 Rails 3+ ...

    acts_as_shopping_cart:简单的购物车实施

    acts_as_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    与acts_as_commentable 兼容(但需要更改数据库架构) 要求 此 gem 的 2.x 版本仅适用于 Rails 4 及更高版本。 对于此 gem 的 Rails 3.x 兼容版本,请使用版本 1.2.0。 这个宝石取决于 CollectiveIdea 的 Awesome ...

Global site tag (gtag.js) - Google Analytics