Я пишу простое приложение Rails в стиле блога и успешно добавило довольно простую функцию #tags. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу придумать способ удалить теги, которые больше не используются ни в одном сообщении. Например, если я сделаю тег #twitter в первом сообщении, а затем удалю упомянутый пост, тег #twitter останется в моей базе данных, даже если на него нигде не будет ссылаться. Я хотел бы удалить неиспользуемые теги. Третья таблица БД создана для отношения (сообщение имеет много тегов, теги принадлежат многим сообщениям), а отношение между тегом и сообщением имеет вид "has_and_belongs_to_many"
**tag.rb**
class Tag < ApplicationRecord
has_and_belongs_to_many :posts
end
**post.rb**
belongs_to :user
has_many :likes, dependent: :destroy
has_many :comments, dependent: :destroy
has_and_belongs_to_many :tags, dependent: :destroy
after_create do
hashtags = self.body.scan(/#\w+/)
hashtags.uniq.map do |hashtag|
tag = Tag.find_or_create_by(name: hashtag.downcase.delete('#'))
self.tags << tag
end
end
before_update do
self.tags.clear
hashtags = self.body.scan (/#\w+/)
hashtags.uniq.map do |hashtag|
tag = Tag.find_or_create_by(name: hashtag.downcase.delete('#'))
self.tags << tag
end
end
from **post_controller.rb**
def hashtags
tag = Tag.find_by(name: params[:name])
@posts = tag.posts.page(params[:page])
end
**schema.rb**
create_table "posts", force: :cascade do |t|
t.string "title"
t.text "body"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.string "image_filename"
t.string "posts"
t.string "image"
end
create_table "posts_tags", id: false, force: :cascade do |t|
t.bigint "post_id"
t.bigint "tag_id"
t.index ["post_id"], name: "index_posts_tags_on_post_id"
t.index ["tag_id"], name: "index_posts_tags_on_tag_id"
end
create_table "tags", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end