2011-04-12 52 views
0

我新的軌道,並試圖對我的文章索引頁面顯示評論數限制爲2限制在帖子指數在評論Rails應用程序

下面是我的posts_controller:

class PostsController < ApplicationController 

    before_filter :authorize, :except => [:index, :show] 

    # GET /posts 
    # GET /posts.xml 
    def index 
    @posts = Post.all(:include => :comments, :order => "created_at DESC") 
    @comments = Comment.find(:all, :order => "created_at DESC", :limit => 1) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.xml 
    def show 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/new 
    # GET /posts/new.xml 
    def new 
    @post = Post.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @post } 
    end 
    end 

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    end 

    # POST /posts 
    # POST /posts.xml 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to(@post, :notice => 'Post was successfully created.') } 
     format.xml { render :xml => @post, :status => :created, :location => @post } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /posts/1 
    # PUT /posts/1.xml 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     format.html { redirect_to(@post, :notice => 'Post was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.xml 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to(posts_url) } 
     format.xml { head :ok } 
    end 
    end 
end 

以下是我的Post模型

類崗位<的ActiveRecord :: Base的

has_attached_file:光度計0::樣式 => {:medium =>「600x600>」,:thumb =>「100x100>」}, :storage =>:s3, :s3_credentials =>「#{RAILS_ROOT}/config/s3。 YML」, :路徑=> 「/:附接/:ID /:風格/:文件名」

的has_many:評論

驗證:姓名,:存在=>真 驗證:標題,:存在= >真, :長度=> {:最小=> 5}

下面是我的職位索引視圖

<table> 
    <tr> 
    <th>BoxScore</th> 
    <th>Content</th> 
    </tr> 
</table> 

<% @posts.each do |post| %> 
    <%= image_tag post.photo.url(:medium), :class =>"floatleft" %> 
    <p> 
    <%= post.content %> 
    </p> 
    <div class="comments center"> 
    <h3>Comments:</h3> 
     <%= render :partial => post.comments.reverse %> 
    <div class="links"> 
    <% if admin? %> 
     <%= link_to "New Post", new_post_path %> 
     <%= link_to 'Edit', edit_post_path(post) %> 
    <%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %> 
    <% end %> 
    <%= link_to 'Comment on the Game', post %> 
    </div> 
</div> 
<% end %> 

</div> 

評論部分下面

<% div_for comment do %> 
    <p> 
     <strong>Posted <%= time_ago_in_words(comment.created_at) %> ago 
     </strong> 
       by 
       <br/> 
       <%= h(comment.commenter) %> 
       <br/> 
     <%= h(comment.body) %> 
       <br/> 
       <%= link_to 'More Comments', comment.post %> 
    </p> 
<% end %> 

,我沒有得到一個錯誤信息,我只是不知道如何限制的意見,我們正在繪製的金額帖子索引頁面。謝謝

+0

你應該張貼您的部分太多,多數民衆贊成與評論的內容,說什麼樣的錯誤,你這個獲得。 – 2011-04-12 03:07:17

回答

1

不幸的是,你不能在預先加載的關聯上指定條件。同樣,你不能限制基於條件返回的行數(據我所知,儘管有很多我不知道的關於SQL函數的東西)。

所以你堅持兩種:

  1. 加載所有你在查詢中顯示收到的評論,並在您的應用程序限制顯示的數字。
  2. 對每個帖子只顯示2條評論個別

最佳解決方案取決於您的使用案例。如果您希望僅顯示5個帖子並且每個帖子都有數千條評論,則選項1可能不是非常高效,選項2可能是一個很好的解決方案。如果您期望每頁顯示更多帖子,並且只有少數評論(更可能的場景),那麼第一個選項將是您最好的選擇。

選項1個

# controller 
@posts = Post.limit(20).all 
@comments = Comment.find(@posts.collect &:id).group_by &:post_id 

# view 
<% @comments[@post.id].first(2).each do |comment| %> 
    ... 
<% end %> 

選項2

# controller 
@posts = Post.limit(5).all 

# view 
<% post.comments.limit(2).each do |comment| %> 
+0

如果你不想確保你的結果是一個數組,那麼調用'all'通常是一個壞主意。 'ActiveRecord :: Relation'響應'Array'所具有的大多數方法,所以你可以用'each'或'map' /'collect'對進行迭代。但是'所有'都渴望加載結果集,從性能的角度來看,這不是一個好主意。 – 2013-08-29 14:31:32

+0

@GaborGarami這*可以是真實的,但並不總是如此。如果您的應用程序完全適合Rails的CRUD,那麼您可能會放棄讓您的控制器組裝Arel查詢,您的視圖層將通過迭代來執行。但是,在很多情況下,如果您需要在檢索後處理數據,組裝自定義緩存鍵或修改這些對象(例如'@ post.touch(:last_viewed)'),這種情況會崩潰。讓視圖直接觸發SQL查詢(模型的責任)也是不太理想的,無需控制器的幫助。 – coreyward 2013-08-29 18:16:01

+0

是的,例外總是在這裏:-)。但至少在答案的情況下,「全部」是不必要的。 – 2013-08-30 23:25:00