acts_as_taggable:根据用户可以选择的上下文创建标记

时间:2014-10-22 09:31:42

标签: ruby-on-rails ruby acts-as-taggable-on

我想知道acts_as_taggable gem是否适合我的情况。

我想要实现的是管理员可以添加具有特定上下文的标签列表,用户可以根据上下文选择其中一些标签。

例如,管理员可以创建以下标记:

标签组1

  • 上下文:behaviour_skills
  • 名称:分析,好奇,......

标签组2

  • 上下文:it_skills
  • 名称:ruby,python,...

并且用户1将选择(例如):

  • 在行为(特定输入)的背景下:解析,......
  • 在技能(特定输入)的背景下:ruby,c#,...

我的问题是,关于acts_as_taggable表,表Tag仅包含名称。上下文仅与标记相关联。

这样,我可以在Tag中添加“context”字段吗?

并像这样创建我的标签:

list = [{name: 'tag 1', context: 'context 1'}, {name: 'tag 2', context: 'context 2' }, ...]
list.each do |tag|
  ActsAsTaggableOn::Tag.new(name: tag[:name], context: tag[:context]).save
end

并显示如下:

skill_tags = ActsAsTaggableOn::Tag.where(context: skills)

或API有特定方法可以适合我的情况?或从头开始做什么?

(基本上,我想要实现的系统非常类似于“最喜欢的标签”,“忽略标签”上的SO)

感谢您的建议!

1 个答案:

答案 0 :(得分:0)

绝对可以在您的情况下使用。

也许您的用例要求您保存" context"在标签上,但我不知道你为什么会这样做。看起来你更适合在用户类中使用密钥,更好的是将YAML文件作为密钥。例如,您的yaml文件可能如下所示:

Behavior:
  - Analytics
  - Curious
IT:
  - Ruby
  - Python

然后在用户

上使您的YAML文件保持不变
TRAITS_KEY = YAML.load_file({path_to_yaml_file})

然后你可以在任何需要的地方打电话

User::TRAITS_KEY['Behavior'] <= would return ['Analytics', 'Curious']

然后在创建选择框时,仅根据上下文提供标记选项。您可以将密钥设置为您的上下文,然后选项只是该上下文中的数组中的选项。暗示当使用&#34; Ruby&#34;标记某些东西时。它是基于您的YAML文件的IT技能。然后再次搜索时,您可以使用YAML文件(取自本示例中编辑的acts_as_taggable文档)

# Find users that matches all given tags ('Super Coders'):
User.tagged_with(User::TRAITS_KEY['IT'], :match_all => true)

# Find users with any of the specified tags ('Any one with dev skills'):
User.tagged_with(User::TRAITS_KEY['IT'], :any => true)

# Find users that has not been tagged with it tags ('Non Devs'):
User.tagged_with(User::TRAITS_KEY['IT'], :exclude => true)

他们的文档非常有用。但我不知道需要在标签上保存上下文。作为警告,我没有测试上面的任何代码,它都是从内存和/或查看我有类似需求的现有项目完成的。这至少应该为您提供我如何处理这个问题的概念。

希望这有帮助!