ruby-on-rails ruby tags rails-activerecord acts-as-taggable-on

ruby on rails - ¿Cómo hacer un multi modelo tag_cloud con una tabla de unión?



ruby-on-rails tags (1)

En mi opinión, podrías usar polimorphing. Por favor, vea Asociaciones de registros activos

En su caso, el modelo podría ser el siguiente:

class Tag < ActiveRecord::Base belongs_to :taggable, polymorphic: true .... class Habit < ActiveRecord::Base has_many :tags, as: :taggable .... class Goal < ActiveRecord::Base has_many :tags, as: :taggable ....

Y en migraciones:

create_table :tags , force: true do |t| t.references :taggable, polymorphic: true, index: true t.timestamps null: false end

Después de esto, puedes:

@tags = Tag.include(:taggable) @tags.each do |tag| type = tag.taggable_type # string, some of ''habit'', ''goal'' etc id = tag.taggable_id # id of ''habit'', ''goal'' etc end

Tengo una mesa de unión

create_table "combine_tags", force: true do |t| t.integer "user_id" t.integer "habit_id" t.integer "valuation_id" t.integer "goal_id" t.integer "quantified_id" end

cuyo objetivo es hacer que tag_cloud funcione para múltiples modelos. Puse esto en el application_controller

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

Mi tag_cloud se ve así:

<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %> <%= link_to tag.name, tag_path(tag), :class => css_class %> <% end %> # or this depending on which works: <% tag_cloud CombineTag.tag_counts, %w[s m l] do |tag, css_class| %> <%= link_to tag.name, tag_path(tag.name), class: css_class %> <% end %>

Tengo esta línea en _forma de todos los modelos: <%= f.text_field :tag_list %>

combine_tags_helper

module CombineTagsHelper include ActsAsTaggableOn::TagsHelper end

modelos

class CombineTag < ActiveRecord::Base belongs_to :habit belongs_to :goal belongs_to :quantified belongs_to :valuation belongs_to :user acts_as_taggable end class Habit < ActiveRecord::Base # Same goes for other models has_many :combine_tags acts_as_taggable end

Por favor, avíseme si necesita más explicaciones o códigos para ayudarme a ayudar :)