每天一剂Rails良药之Tagging

“social networking”产生了一个东西叫“tagging”,而DHH为Rails写了一个acts_as_taggable插件,简化了Rails开发tagging功能
acts_as_taggable依赖于Rails的polymorphic associations feature,允许对任何model进行tag

1,安装插件
[code]
ruby script/plugin install legacy
[/code]

2,建立数据库表
由于model和tag是Many-to-Many的关系,我们需要建立如下migration
[code]
class AddDatabaseStructureForTagging < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.column :name, :string
end
create_table :taggings do |t|
t.column :taggable_id, :integer
t.column :tag_id, :integer
t.column :taggable_type, :string
end
end

def self.down
drop_table :tags
drop_table :taggings
end
[/code]
其中taggings表为关系表,为model(taggable)和tag建立多对多关联

3,例子
[code]
class Contact < ActiveRecord::Base
acts_as_taggable
end
[/code]
在model类定义里加上acts_as_taggable即可让该model具有tagging的功能

[code]
class ContactsController < ApplicationController
def list
@contacts = if tag_name = params[:id]
Tag.find_by_name(tag_name).tagged
else
Contact.find(:all)
end

def tag
contact = Contact.find(params[:id])
contact.tag_with(params[:tag_list])
contact.save
end
end
[/code]
Tag.find_by_name(tag_name).tagged即可得到name为tag_name的Tag的contacts(如果对多个model进行tagging,可能要对taggings表的taggable_type进行查询)
contact.tag_with(params[:tag_list])则用以空格分隔的tag名列表来对该contact对象进行tagging,如果tags表没有某tag,则new一个该tag
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值