创建了两个表,以及对应的两个 model
分别是:
ActsAsTaggableOn::Tag 有 id,name
上面是标签表。
ActsAsTaggableOn::Tagging 有 id,tag_id,taggable_id,taggable_type,tagger_id,tagger_type,context
上面是关联表(中间表)
tag_id 就是第一张表,标签表的 id
taggable 为被标记者
tagger 为标注者(我们没有用到)
context 为标签类型(我们只用到 tags,我会新增 skills)
新增字段:tag_list,skill_list,interest_list
用法:
1, (标签类型,对应中间表的 content 字段)
# Alias for acts_as_taggable_on :tags
acts_as_taggable
acts_as_taggable_on :skills, :interests
tag_list= (设置标签内容,会创建对应的中间表和 tag 表)
tag_list (看似是字段内容,其实是 tag 的内容拼接起来的)
skill_list (看似是字段内容,其实是 tag 的内容拼接起来的)
(上面设置的时候是字符串,读取的时候是数组)
2,
tag_list.add 在原字段的基础上多了 add 方法
tag_list.remove 在原字段的基础上多了 remove 方法
tags 复数形式(中间表)
skill_counts 统计
3,(在 1 的基础上维持输入时的顺序)
# Alias for acts_as_ordered_taggable_on :tags
acts_as_ordered_taggable
acts_as_ordered_taggable_on :skills, :interests
4,
tagged_with (类方法,参数是标签的名字,返回是有此标签的对应的类的实例)
5,
find_related_skills (实例方法,不带参数,返回和此调用者有类似标签的实例对象)
6,(动态新增 tag 类型,不推荐,tag 类型应该一开始就定好。)
set_tag_list_on
(下面几个方法不是动态生成的,平时也可用!)
tag_list_on (实例方法,参数为类型)
tags_on (实例方法,参数为类型)
tag_counts_on (参考 9)
tagged_with (参考 4)
7,(多一层关联,标签创建者,目前我们用不上)
acts_as_tagger
acts_as_taggable_on :locations (参考 7)
(下面几个除 tagged_with 外,均为实例方法)
tag
owned_taggings
owned_tags
tagged_with (参考 4)
locations_from
owner_tags_on
8,
skill_list_changed? (Rails 自带)
changes (Rails 自带)
changes.should
skill_list_change.should
9,
tag_counts_on (类方法,参数为标签类型)
tag_cloud (参考示例,自己定义的方法)
10,
remove_unused_tags (不使用的标签,要删除掉?)
force_lowercase (保存时强制转换成小写?)
force_parameterize (如何保存标签,类似 to_params)
strict_case_match (数据库查询标签时,大小写是否敏感)
delimiter (默认标签之间用‘逗号’分隔)
aats = ActsAsTaggableOn::Tagging.where(context: “skills”).group(:tag_id).order(‘count_all desc’).count;
aats.map do |key, value|
“#{value} – #{ActsAsTaggableOn::Tag.find(key).name}”
end
File.open(‘tag_list_statistics ‘, ‘w’) do |file|
aats.each do |key, value|
file.write( “#{value} – #{ActsAsTaggableOn::Tag.find(key).name}\n” )
end
end