2012-05-02 21 views
3

首先計算器後,所以和我一起承擔:)如何訂購陣列通過變量視圖

所以我必須具有多態關聯帶票模型中郵模型。

我的主要問題是以最高票數排序每篇文章。我正在嘗試實施Upvote系統。問題:如何訂購最高票數? (@total)

看來我的代碼在我的意見(@upcount,@downcount,@total),我可能在我的控制器,但我只是不知道如何做到這一點。

理想情況下,我想在社區操作中做這樣的事情:Post.order(「@ total」),但顯然這不起作用。

郵政型號

class Post < ActiveRecord::Base 
belongs_to :user 
has_many :votes, :as => :votable 

投票模式:

t.integer "upvote" 
t.integer "downvote" 
t.string "votable_type" 
t.integer "votable_id" 
t.integer "user_id" 

柱控制器:

def community 
@post = @votable = Post.all 
end 

在我看來,頁面(這裏的事情變得棘手):

 <% @post.each do |post| %> 
<div class="eachpostrate"> 
<% if signed_in? then %> 
    <%= form_for [post, Vote.new] do |f| %> 
    <%= f.hidden_field :downvote, :value => "0" %> 
    <%= f.hidden_field :upvote, :value => "1" %> 
    <%= f.submit "8", :class => "upvotethumbup" %> 
     <% end %> 
    <% if post.votes.empty? then %> 
    <span class="upvotecount"> 
      <p> 0 </p> 
     </span> 
     <% else %> 
     <% @upcount = [] %> 
     <% @downcount = [] %> 
     <span class="upvotecount"> 
     <p> 
      <% post.votes.each do |vote| %> 
      <% @upcount << vote.upvote %> 
      <% @downcount << vote.downvote %> 
      <% end %> 
      <% @total = @upcount.sum - @downcount.sum %> 
      <%= @total %> 
      </p> 
    </span> 
    <% end %> 

我解決了這個使用nilbus與把比分方法在我的崗位模型,而不投票型號

def score 
self.votes.upvotes.count - self.votes.downvotes.count 
    end 

否則,我的職位是根據現在給予好評有序的例外規定的方向!感謝大家!

回答

1
posts.sort {|x, y| (x.votes.collect(&:upvote).size - x.votes.collect(&:downvote).size) <=> (y.votes.collect(&:upvote).size - y.votes.collect(&:downvote).size) } 
+0

這不考慮upvotes和downvotes –

+0

你是對的!日Thnx。 – earlonrails

+0

另外,你知道你可以使用sort_by並避免不得不列出你比較兩次的東西嗎? posts.sort {| x | x.votes.collect(&:upvote).size - x.votes.collect(&:downvote).size}讓它更容易閱讀:-) –

3

您應該計算upvotes,downvotes,總數量在安置自己的模型來代替。通常,儘可能在模型中放入與模型相關的代碼和邏輯,而不是在視圖中。這樣您就可以在其他視圖中再次使用它,並且它在邏輯上更加分組。

具體來說,在這種情況下,您需要使用模型關聯提供的方法以及範圍。

class Vote < ActiveRecord::Base 
    scope :upvotes, where(:upvote => 1) 
    scope :downvotes, where(:downvote => 1) 
end 

有了這些範圍,就可以比較容易地指望每一個職位的選票。

upvotes = post.votes.upvotes.count 
downvotes = post.votes.downvotes.count 
total = post.votes.count 

您可以通過從upvotes減去downvotes計算投票的分數。

class Vote < ActiveRecord::Base 
    def score 
    upvotes.count - downvotes.count 
    end 
end 

然後你就可以使用該分數,然後遍歷它們就像你在你看你的帖子進行排序。

@posts = @posts.sort_by(&:score) 

爲了獲得最佳性能,在第一次加載帖子時包含所有投票是一個好主意。爲此,您可以在控制器中使用include。否則,在計算分數時,它將不得不做額外的查詢來查找投票。

def community 
    @post = @votable = Post.includes(:votes).all 
end 

順便說一句 - 任何理由你創建兩個變量與相同的內容(@post和@votable)?

+0

哇!真棒迴應。 '@post = @ votable'好像是爲多形態做什麼的,所以如果我提到'@ votable',它會指的是'@ post' 我在哪裏放置投票,降價和總額?在我看來? – comebacknader

+0

是的,您可以在@ posts.each循環內的視圖中創建這些變量。或者你可以直接引用post.votes.upvotes.count。 –

+0

Post.include給我的錯誤信息: NoMethodError 私有方法'包括」呼籲#<類別:0x0000012c254360> – comebacknader