私は、コメントを投稿してそれらのコメントに返信できる単一のページを表示する単純なレールアプリを持っています。
コメントのモデルは非常に単純です。
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')
ありがとう!