gpt4 book ai didi

ruby-on-rails - Rails 递归实体性能问题

转载 作者:行者123 更新时间:2023-12-04 05:17:04 24 4
gpt4 key购买 nike

我有一个简单的 rails 应用程序,它显示一个页面,可以在其中发表评论并回复这些评论等等。

评论模型非常简单:

class Comment < ActiveRecord::Base
attr_accessible :text, :parent_id
attr_accessor :level

has_many :replies, :class_name => 'Comment', :foreign_key => 'parent_id'
belongs_to :parent, :class_name => 'Comment'

scope :get_replies, where(parent_id: to_param})

end

并且, Controller 将仅通过查看根级别的评论:
def index
@root_comments = Comment.where('parent_id IS NULL')
end

最后, View 将获取根评论的回复评论并呈现所有内容:
<% @root_comments.each{ |c| c.level = 0} %>

<% while @root_comments.size > 0 %>
<% comment = @root_comments[0] %>
<% @root_comments.delete_at(0) %>
<% replies = comment.get_replies %>
<% replies.each{ |r| r.level = comment.level + 1} %>
<% @root_comments = replies + @root_comments %>

<div class="comment" style=<%= "margin-left:#{(comment.level * 50)}px;" %> >
<%= comment.text %>
</div>

<% end %>

到目前为止一切顺利...直到检查 rails 服务器输出和...
  Comment Load (0.3ms)  SELECT "comments".* FROM "comments" WHERE (parent_id IS NULL)
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE "comments"."parent_id" = 1
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE "comments"."parent_id" = 4
...
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE "comments"."parent_id" = 16
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE "comments"."parent_id" = 17

SQL 查询无处不在...

我还没有找到任何关于内置 Rails 服务器优化的信息来管理这种方法。

1)有人知道这种优化是否存在?

2)如果它不存在,我该如何解决这个问题?

我试图在 Controller 中加载联系人,但服务器输出显示相同数量的查询。
@root_comments = Comment.includes(:replies).where('parent_id IS NULL')

谢谢!

最佳答案

您可以做的一件事是存储每个评论的根评论,因此您可以使用两个查询来查询所有评论:
* where('parent_id IS NULL') # 将这些的 id 提取到 root_ids
* where('root_id IN ?', root_ids)

缺点是您必须在代码中重建树。

关于ruby-on-rails - Rails 递归实体性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131656/

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