gpt4 book ai didi

mysql - 如何在 ruby​​ on rails 中实现递归删除?

转载 作者:太空宇宙 更新时间:2023-11-03 16:19:11 27 4
gpt4 key购买 nike

我正在用 ruby​​ on rails 制作一个应用程序,类似于 Reddit,在这个项目中,我决定使用 多态在 Comment 模型上使用递归关联

递归删除文章<-评论<-评论等

问题是,当我删除文章时,哪些评论取决于 :delete_all(或 :destroy,已经尝试过了)has_many关联,只会删除第一层评论。
Comments 也是如此,只有第一级回复被删除,我真的不希望那里有孤立的评论。

问题是,如何在这种情况下实现递归删除?

models/article.rb:

class Article < ActiveRecord::Base
belongs_to :user
has_and_belongs_to_many :tags
has_many :comments, as: :commentable , :dependent => :delete_all
end

models/comment.rb:

class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :commentable, polymorphic: true
has_many :comments, as: :commentable , :dependent => :delete_all
end

articles_controller.rb:

def destroy
@article = Article.find(params[:id])
@comments = @article.comments.destroy
@article.destroy

redirect_to articles_path
end

comments_controller.rb:

class CommentsController < ApplicationController
before_action :find_commentable
.
.
.
def create
@comment = @commentable.comments.new(comment_params)

if @comment.save
redirect_to :back, notice: 'Your comment was successfully posted!'
else
redirect_to :back, notice: "Your comment wasn't posted!"
end
end

private

def comment_params
params.require(:comment).permit(:body, :user_id)
end

def find_commentable
@commentable = Comment.find_by_id(params[:comment_id]) if params[:comment_id]
@commentable = Article.find_by_id(params[:article_id]) if params[:article_id]
end
end

views/articles/show.html.erb

.
.
.
<ul>
<%= render(partial: 'comments/comment', collection: @article.comments) %>
</ul>

views/comments/_comment.html.erb

<li>
<%= comment.body %> -
<small>Submitted <%= time_ago_in_words(comment.created_at) %> ago by <%= User.find(comment.user_id).name %></small>

<%= form_for [comment, Comment.new] do |f| %>
<%= f.hidden_field(:user_id , :value => current_user.id) %>
<%= f.text_area :body, placeholder: "Add a Reply", required: true %><br/>
<%= f.submit "Reply" %>
<% end %>
<ul>
<%= render partial: 'comments/comment', collection: comment.comments %>
</ul>
</li>

最佳答案

您需要在 Comment 和 Article 中使用 :destroy 而不是 :delete_all 才能使级联正常工作,如 delete does not trigger callbacks .

还要注意 @comments = @article.comments.destroy 不会在这里做任何事情(你有一个 CollectionProxy 所以它会 function like this )你应该使用destroy_all 代替。但是,仅此一项并不能正确解决您的递归删除问题,并且只会删除顶级评论的评论,然后就此停止。事实上,如果您使用 :destroy,则根本不需要这一行。

关于mysql - 如何在 ruby​​ on rails 中实现递归删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37406414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com