2013-01-11 179 views
3

當我一個Rails應用程序的頁面上定義了三個變量簡化紅寶石控制流程:定義變量

if current_user 
    if Vote.where(:user_id => current_user.id, :post_id => post.id, :direction => 0).count > 0 
     active = ' upactive' 
    elsif Vote.where(:user_id => current_user.id, :post_id => post.id, :direction => 1).count > 0 
     active = ' downactive' 
    end 
    end 

    unless Vote.group(:post_id).where(:post_id => @posts.map(&:id), :direction => 0).count[post.id] == nil 
    upvotes = Vote.group(:post_id).where(:post_id => @posts.map(&:id), :direction => 0).count[post.id] 
    else 
    upvotes = 0 
    end 

    unless Vote.group(:post_id).where(:post_id => @posts.map(&:id), :direction => 1).count[post.id] == nil 
    downvotes = Vote.group(:post_id).where(:post_id => @posts.map(&:id), :direction => 1).count[post.id] 
    else 
    downvotes = 0 
    end 

我注意到有相當多的在if和unless語句重複的代碼。我怎樣才能寫出三個與上述變量相同的變量聲明,確保變量始終爲0而不是nil

回答

2

您可以在此使用條件賦值運算符來幫助減少代碼。例如:

if current_user 
    if Vote.where(:user_id => current_user.id, :post_id => post.id, :direction => 0).count > 0 
    active = ' upactive' 
    elsif Vote.where(:user_id => current_user.id, :post_id => post.id, :direction => 1).count > 0 
    active = ' downactive' 
    end 
end 

upvotes = Vote.group(:post_id).where(:post_id => @posts.map(&:id), :direction => 0).count[post.id] || 0 
downvotes = Vote.group(:post_id).where(:post_id => @posts.map(&:id), :direction => 1).count[post.id] || 0 

如果所述第一部分的計算結果爲零,則使用右側作爲缺省值的有條件分配操作者基本上說。

+0

+1對於upvotes和反對票的重構。我也正在研究這個。它應該更快,因爲減少了數據庫命中。我還想知道'elseif'是否應該只是'else',因爲如果'Vote'查詢'count == 0',就有一個潛在的邏輯漏洞,允許'active'不確定。 –

+0

我大多隻留下活動變量,因爲我沒有足夠的上下文信息,但我同意那裏可能存在邏輯漏洞。例如,如果當前用戶只能對帖子投一票,那麼可以通過使用類似Vote.first(:user_id => current_user.id,:post_id => post.id)來簡化該邏輯,然後評估Ruby中的方向。但由於我對這個應用程序瞭解不多,所以我放棄了它。 :) –

+0

嘿,很高興這不是我的系統來維護。 :-) –