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
。
+1對於upvotes和反對票的重構。我也正在研究這個。它應該更快,因爲減少了數據庫命中。我還想知道'elseif'是否應該只是'else',因爲如果'Vote'查詢'count == 0',就有一個潛在的邏輯漏洞,允許'active'不確定。 –
我大多隻留下活動變量,因爲我沒有足夠的上下文信息,但我同意那裏可能存在邏輯漏洞。例如,如果當前用戶只能對帖子投一票,那麼可以通過使用類似Vote.first(:user_id => current_user.id,:post_id => post.id)來簡化該邏輯,然後評估Ruby中的方向。但由於我對這個應用程序瞭解不多,所以我放棄了它。 :) –
嘿,很高興這不是我的系統來維護。 :-) –