如何为tag_cloud使用多个模型?

时间:2015-04-27 21:27:49

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

_tags.html.erb

#Version 1 (Just lists out habits tags)
<% tag_cloud Habit.tag_counts, %w{s m l} do |tag, css_class| %>
  <%= link_to tag.name, tag_path(tag.name), class: css_class %>
<% end %>

#Version 2
<% 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 %>

我们怎样才能在列出&strong> current_user 的习惯和目标,估值,量化的情况下得到它? f.text_field :tag_list位于这四个模型中的每一个的_form中,它们也是数据库中的单独表。

我还为四个模型中的每一个添加了以下代码。以下是评估价值的方式:

辅助

module ValuationsHelper
  include ActsAsTaggableOn::TagsHelper
end

控制器

class ValuationController < ApplicationController
  def tag_cloud
    @tags = Valuation.tag_counts_on(:tags)
  end
end

用户模型

  User.tag_counts_on(:tags)
  acts_as_tagger
  acts_as_taggable

我使用 act-as-taggable-on gem,我是从railscasts实现的。如果您需要任何进一步的代码或解释,请告诉我们=]

2 个答案:

答案 0 :(得分:3)

在用户模型中使用gem中的方法: acts_as_tagger 来设置特定于用户的标记。 acts_as_taggable_on gem docs的示例:

    class User < ActiveRecord::Base
    acts_as_tagger
    end

    class Photo < ActiveRecord::Base
    acts_as_taggable_on :locations
    end

     @some_user.tag(@some_photo, :with => "paris, normandy", :on => :locations)
     @some_user.owned_taggings
     @some_user.owned_tags

    @some_user.tag(@some_photo, :with => "paris, normandy", :on => :locations, :skip_save => true) 

在您的情况下,您需要设置一个包含以下ID的联接表:习惯,目标,估值和量化,然后您应该能够创建一个变量来调用该表或单个设置上的标记计数针对特定用户的观点中的每个习惯,目标,评估和量化。无论哪种方式,它应该看起来像这样:

    @tags = YourModel.tag_counts_on(**context**)

UPDATE ATTEMPT

    class User < ActiveRecord::Base
      acts_as_tagger
    end

    class Habit < ActiveRecord::Base
      # This goes for Valuation, Goal, and Quantified too.
      acts_as_taggable_on :combine_tags
    end

    class CombineTag < ActiveRecord::Base
      belongs_to :habit
      belongs_to :goal
      belongs_to :quantified
      belongs_to :valuation
    end

我尝试迁移这个:

    class CreateCombineTags < ActiveRecord::Migration
      def change
        create_table :combine_tags do |t|
          t.valuation_id :integer
          t.goal_id :integer
          t.quantified_id :integer
          t.habit_id :integer

          t.timestamps null: false
        end
      end
    end

但我得到了undefined method 'valuation_id' for #<ActiveRecord::我不知道has_manybelongs_to是否足以加入模型,我会假设是。

那我该如何处理@tags = YourModel.tag_counts_on(**context**)?语境是什么意思?这是 _tags.html.erb 吗?如果是这样,它会是这样的:

<% @tags = CombineTag.tag_counts_on(**???**)
<% tag_cloud @tags.tag_counts, %w{s m l} do |tag, css_class| %>
  <%= link_to tag.name, tag_path(tag.name), class: css_class %>
<% end %>

答案 1 :(得分:1)

创建一个名为Tagalicious的模型。

因为你想在侧边栏中把它放在application_controller中:

before_action :tag_cloud

def tag_cloud
  @tags = Tagalicious.tag_counts_on(:tags)
end

然后在帮助者中:

module TagaliciousHelper
  include ActsAsTaggableOn::TagsHelper
end

然后在模型中:

class Tagalicious < ActiveRecord::Base
  belongs_to :habit
  belongs_to :goal
  belongs_to :quantified
  belongs_to :valuation
  acts_as_taggable
end

tag_cloud:

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

希望这会澄清一些事情。我无法弄清楚如何在各种模型中<%= f.text_field :tag_list %>指向Tagalicious模型。

如果您愿意,可以在聊天中查看这些内容,或者针对该特定问题尝试其他问题。