Я следовал этому туториалу , чтобы сделать такой же раздел комментариев на моем сайте, и теперь я хочу отобразить количество комментариев к статье, но у меня может быть только количество ответов на статью, не включая количество ответов комментариев.
Я не хочу добавлять столбец к моей модели комментариев со ссылкой на идентификатор статьи, потому что мой сайт уже подключен к сети, и все старые сообщения будут иметь 0 комментариев, потому что у них не будет этого нового столбца.
Есть идеи, как я могу это сделать? Я думаю, это как-то связано с belong_to
, но на официальном документе я не могу его найти.
Мой model/comment.rb
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
has_many :comments, as: :commentable
serialize :report, Array
validates :commenter, presence: true, length: { in: 1..500 }
end
мой model/article.rb
class Article < ApplicationRecord
include BCrypt
serialize :view, Array
serialize :upvote, Array
serialize :report, Array
has_many :comments, as: :commentable, dependent: :destroy
validates :title, presence: true, length: { in: 1..60 }
validates :content, presence: true
has_secure_password
end
EDIT:
Может быть, я мог бы сделать метод в моем помощнике с циклом, который будет считать каждый комментарий комментария, но я не знаю, как я мог бы сделать этот цикл как Article.find(my_article_id).comments.each do
, и тогда я не знаю, как это сделать, тогда, возможно, я должен сделать как Comment.comments.each do
?
Я думал сделать рекурсивный метод, но я всегда изо всех сил пытался сделать рекурсивный метод
EDIT2:
schema/article
create_table "articles", force: :cascade do |t|
t.string "title"
t.string "author"
t.string "author_ip"
t.string "password_digest"
t.text "content"
t.string "upvote"
t.integer "upvote_count", default: 0
t.string "view"
t.integer "view_count", default: 0
t.string "report"
t.integer "report_count", default: 0
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "activate", default: true
t.integer "comments_count", default: 0, null: false
end
schema/comment
create_table "comments", force: :cascade do |t|
t.text "commenter"
t.string "author"
t.string "author_ip"
t.string "date"
t.integer "commentable_id"
t.string "commentable_type"
t.string "report"
t.integer "report_count", default: 0
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "article_id"
end
EDIT3:
comment migration
class AddCommentsCountToComments < ActiveRecord::Migration[5.2]
def change
add_column :comments, :comments_count, :integer, default: 0, null: false
Comment.reset_column_information # to reset cached values
Comment.find_each do |comment|
comment.update(comments_count: comment.comments.count) # updating old articles comments_counter
end
end
end