如何使用连接 table 制作多模型 tag_cloud?
How to make a multi model tag_cloud with a join table?
我有一个加入table
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
其目的是使一个 tag_cloud 适用于多个模型。我把这个放在 application_controller
def tag_cloud
@tags = CombineTag.tag_counts_on(:tags)
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 %>
# 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 %>
我在所有模型的 _form 中都有这一行:<%= f.text_field :tag_list %>
combine_tags_helper
module CombineTagsHelper
include ActsAsTaggableOn::TagsHelper
end
型号
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
如果您需要进一步解释或code请告诉我,以帮助您帮助我:)
在我看来,您可以使用 polimorphing。请参阅 Active Record Associations
在您的情况下,模型可能是下一个:
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
....
在迁移中:
create_table :tags , force: true do |t|
t.references :taggable, polymorphic: true, index: true
t.timestamps null: false
end
在此之后您可以:
@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
我有一个加入table
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
其目的是使一个 tag_cloud 适用于多个模型。我把这个放在 application_controller
def tag_cloud
@tags = CombineTag.tag_counts_on(:tags)
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 %>
# 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 %>
我在所有模型的 _form 中都有这一行:<%= f.text_field :tag_list %>
combine_tags_helper
module CombineTagsHelper
include ActsAsTaggableOn::TagsHelper
end
型号
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
如果您需要进一步解释或code请告诉我,以帮助您帮助我:)
在我看来,您可以使用 polimorphing。请参阅 Active Record Associations
在您的情况下,模型可能是下一个:
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
....
在迁移中:
create_table :tags , force: true do |t|
t.references :taggable, polymorphic: true, index: true
t.timestamps null: false
end
在此之后您可以:
@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