2012-02-27 43 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中的評論只是一個數組。它實際上是一個奇特的代理對象,取決於調用的方法和緩存集合的狀態,它們像一個數組或作爲模型查詢方法的接口。

+0

好的,但我認爲在我執行@ post.comments時也必須執行查詢嗎?我的想法是,因爲我沒有給實例變量分配註釋數組,所以只能使用後置對象,這必須從數據庫中檢索。 – 2012-02-27 09:45:53

+0

嗯,當然,它必須在某個時候完成。 AR通常會在第一次實際使用時延遲加載關聯對象,並且之後只會在您更改集合(或執行顯式查找或某事)時重新加載緩存。我不是100%確定的,但comments.new調用可能已經加載了其他評論,最後還記得一個未保存的對象。 – 2012-02-27 09:51:41

+0

如果那對你有幫助,你能接受答案嗎? – 2012-03-07 10:27:53