2

私は、コメントを投稿してそれらのコメントに返信できる単一のページを表示する単純なレールアプリを持っています。

コメントのモデルは非常に単純です。

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

そして、コントローラーは、ルート レベルのコメントのみを表示するために渡します。

def index
  @root_comments = Comment.where('parent_id IS NULL')
end

最後に、ビューはルート コメントの返信コメントを取得し、すべてをレンダリングします。

<% @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クエリ...

この種のアプローチを管理するための組み込みのレールサーバーの最適化については何も見つけていません。

1) そのような最適化が存在するかどうか誰でも知っていますか?

2) 存在しない場合、どうすればこの問題を解決できますか?


コントローラーに連絡先を積極的にロードしようとしましたが、サーバーの出力には同じ数のクエリが表示されます。

@root_comments = Comment.includes(:replies).where('parent_id IS NULL')

ありがとう!

4

3 に答える 3

2

できることの 1 つは、各コメントとともにルート コメントを保存することです。したがって、2 つのクエリですべてのコメントをクエリでき
ます
。 root_ids)

欠点は、コードでツリーを再構築する必要があることです。

于 2013-01-03T18:28:48.143 に答える
1

railseager loadingをチェックしてください。試す

 def index
  @root_comments = Comment.includes(:comment).where('parent_id IS NULL')
 end
于 2013-01-03T19:16:45.617 に答える
0

それがあなたのパフォーマンスに役立つかどうかはわかりませんが、acts_as_tree ジェムを確認することをお勧めします。

https://github.com/amerine/acts_as_tree

少なくとも、車輪の再発明を回避できる可能性があります。

于 2013-01-03T01:32:43.620 に答える