2012-02-27 5 views
0

同じページにコメントのある投稿があり、投稿/コメントを表示しているのと同じページに新しいコメントを取り込むためのフォームをレンダリングするとします。投稿has_manyコメント。コードは次のように:Railsのレンダリングコマンドの結果に悩まされている

class PostsController < ApplicationController 

... 

    def show 
    @post = Post.find(:params[id]) 
    @comment = Post.comments.new 
    end 
... 

end 

を今、あなたはあなたのビューで<%= @post.comments.count %>を呼び出すときに、それが保存されたコメントの数を与えるが、あなたは<%= render @post.comments %>を呼び出す場合、それはすべて保存されたコメントを返しPLUS新しく作成された(まだ保存されていません従ってまだ無効です)。どうしてこれなの?これは実際に私がこれを見つけるのに時間がかかりました。これは有用であるとは想像もできません。有効なデータベースレコードをすべてレンダリングするだけではいかがですか?

誰かがこれに遭遇しましたか?修正するのは簡単ですが困惑します。

答えて

0

まあ、@ post.comments.countは実際にはデータベースクエリを実行するので、保存されたレコードの数だけを返すことができます。コレクション内のオブジェクトの数は、@ post.comments.sizeまたは.lengthを使用します。

レンダリングコールAFAIKは、コレクション内のオブジェクトをループするだけです。

ここで知るべきことは、アソシエーションを使用して実際のクエリを実行するときとアクティブなレコードがキャッシュされたオブジェクトを使用しているときの違いです。 @ post.commentsのコメントは単なる配列であると仮定するのは簡単でしょう。実際には、キャッシュされたコレクションのメソッドおよび状態に応じて、Arrayのように、またはModelのクエリメソッドへのインターフェイスとして機能する、派手なプロキシオブジェクトです。

+0

でも、私は@ post.commentsを実行するときにクエリを実行する必要があると思いますか?私は、インスタンス変数にコメント配列を割り当てていないので、ポストオブジェクトのみをデータベースから取得する必要があると私は考えています。 –

+0

それはもちろん、ある時点で行われなければなりません。 ARは通常、最初に実際に使用されたときに関連オブジェクトを遅延ロードし、コレクションを変更する(または明示的な検索などを行う)場合にのみ、キャッシュを再ロードします。私は100%確信していませんが、comments.new呼び出しが既に他のコメントを読み込んでいる可能性があり、最後に保存されていないオブジェクトを覚えています。 –

+0

それがあなたを助けたら、その答えを受け入れることができますか? –

関連する問題