如何使用ActsAsTaggableOn列出特定用户正在使用的标签

时间:2019-06-27 21:36:04

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

我正在使用Devise和ActsAsTaggableOn红宝石来构建类似于个人日记应用程序的东西。

简而言之,每个用户都有一个私有配置文件来创建他们自己的个人期刊的数据库(这是我使用devise的地方)

我想实现用户对期刊进行标签标记的功能,以便他们可以轻松地在数据库中对特定的期刊进行排序和查找,包括在特定用户的期刊数据库中使用的前三个标签。

我使用ActsAsTaggableOn gem成功地将标签添加到每个特定的日记中。但是,我在理解文档时遇到了麻烦,这些文档用于查找特定于用户个人资料的日记标记,因此无法找到用户日记数据库中使用的前三个标签。

我基本上需要ActsAsTaggableOn::Tag.most_used仅过滤用户个人资料中的日记。

任何帮助将不胜感激!

编辑-下面的代码

这是我的用户模型…

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :journals, dependent: :destroy
  validates_presence_of :fname, :lname
  acts_as_tagger
end

这是我的日记本模型。

class Journal < ApplicationRecord
  belongs_to :user
  validates_presence_of :title, :body
  acts_as_taggable_on :tags
end

当我在用户个人资料页面上使用<%= current_user.owned_tags.most_used(3) %>时,在显示页面上将显示以下内容: #<ActsAsTaggableOn::Tag::ActiveRecord_AssociationRelation:0x00007ffb28123ce0>

1 个答案:

答案 0 :(得分:0)

您需要将所有者添加到标签。

class User < ActiveRecord::Base
  acts_as_tagger
end

请注意,在这种情况下,您将无法再使用tag_list,因为它仅存储未拥有的标签。

current_user.tag(@journal, with: "Cars") # to add owned tag to the journal
@journal.tags_from(current_user) # to fetch journal tags

现在您可以为用户获取最常用的标签

current_user.owned_tags.most_used(3)

另一个选项(无所有权):

ActsAsTaggableOn::Tag.joins(:taggable).where(taggable: current_user.journals)
  .distinct.most_used(3)

无论如何,您都将具有ActiveRecord关系。要在视图中显示它,您应该对其进行迭代。

<% most_used_tags.each do |tag| %>
  <%= tag.name %>
<% end %>

<%= most_used_tags.map(&:name).join(', ') %>