2012-05-28 62 views
1

好,所以我有一個審查模式和投票模型(Upvotes和Downvotes通過一個單一變量「喜歡」爲藍本,如果其真正的一個給予好評,如果假的一downvote)。這個選票是一個has_many關係,並且是多態的(我希望能夠在稍後的評論中使用它)。如何遍歷Rails中的關聯?

所以在審查模式具有線

has_many :votes, :as => :votable 

而且票模型的定義如下

class Vote < ActiveRecord::Base 
    belongs_to :votable, :polymorphic => true 
    belongs_to :user 

    def upvote? 
    like 
    end 

    def downvote? 
    !like 
    end 
end 

現在這樣很好,我能給予好評,downvote和刪除票就好了。但我試圖根據upvotes和downvotes生成一個分數(現在只需簡單地向上投票)。 要做到這一點,我添加了以下的評論模型

def score 
    up = 0 
    down = 0 
    self.votes.each do |v| 
    if v.upvote? 
     up += 1 
    elsif v.downvote? 
     down += 1 
    end 
    end 
    up-down 
end 

不過,我總是得到0追溯到答案。錯誤在循環中,因爲我可以將向上或向下變量設置爲它之外的任何變量,並且它們通過。它開始讓我瘋狂,我不知道我會出錯哪裏。

+0

評論模型與用戶/投票有什麼關係? – Kasumi

+0

關係是'has_many:votes,dependent::destroy'用戶模型中還有一些方法可以創建和銷燬投票,檢查用戶是否投票進行審查,並檢查他們投票的方式(使用upvote?和downvote?方法) –

回答

0

如果確定錯誤是在環路,則這是我最好的猜測:

你有v.upvote?作爲if和v.downvote?作爲elsif。

如果這兩個都是錯誤會發生什麼?我很確定什麼都不會發生。因此,0 - 0 = 0,你總是回零。如果你的v.upvote循環是完全正確的?和v.downvote?寫入正確,或者它們是開始的正確值。

嘗試:

if v.upvote? 
... 
else 
... 
end 

很明顯,你有這樣是有原因的那些設置,但你可能只是在分區上錯誤的事情。

希望這會有所幫助。

+0

啊,我沒有想到,但在這種情況下,我知道他們是真的(我把它們放在數據庫中進行測試)。當決定爲upvote/downvote表單顯示哪個部分時,會使用它們。我認爲它的循環,因爲如果我添加到每個循環上的變量(不在if區塊內),它們仍然返回0.這對我說'self.votes.each'不像我期望的那樣工作 –

+0

A測試它的方法是按照原來的方式設置你的循環,除了在頂部添加一個變量:counter = 0然後在循環中添加else並在else塊中增加計數器。然後在循環之後執行logger.debug(counter)來查看循環迭代的次數,而不會觸及上下。使用記錄器驗證你想知道的其他事情。在循環內但在if區外調試以找出每次迭代的v值。我相當肯定你已經按照你應該的方式編寫了循環。奇怪的事情正在發生。 – Ben

+0

哦,尼斯,我不知道logger.debug!謝謝,我確定我會放棄一下吧!希望完全有幫助:D –