2013-11-22 17 views
0

目前,我正在處理視圖中的條件。我需要在模型或控制器中做到這一點,但還沒有找到一種可行的方法。呈現@users的條件(不包括current_users和與朋友關聯的用戶)

我必須通過一個局部的排序他們通過他們的朋友數(簡化所有的例子)呈現10個用戶的視圖:

Index.html.erb

<%= render @users %> 

_partial.html。 ERB

<% unless current_user == user or current_user.friending?(user) %> 
    <%= user.name %> 
<% end %> 

型號/ user.rb

scope :top, :order => "friends_count DESC" 

users_controller.rb /索引

@users = User.top.limit(10) 

但在我的情況下,它檢查在該部分的驗證爲每個用戶。如何在範圍或控制器中更有效地執行此操作並檢查所有內容?

非常感謝所有的答案。非常感謝。

+0

我不知道這是否有助於你的條件下,但爲什麼不使用[will_paginate](https://github.com/ mislav/will_paginate)寶石? –

回答

1
class User 
    scope :top, order("friends_count DESC") 
    scope :skip_user, lambda{|user| where("id != ?", user.id) } 
    scope :skip_user_friends, lambda{|user| where("friend_id != ?", user.id } 
end 

users_controller.rb

@users = User.top.skip_user(current_user).skip_user_friends(current_user).limit(10) 
+0

好工作!這還有一個優點。由於整個查詢的範圍是鏈,所以在檢索'@ users'時,它只會對錶進行一次優化的SQL查詢。 – kiddorails

+0

是的,那是客觀的。我喜歡將範圍分解爲更小的聚焦位,因爲它們更容易在其他上下文中重用。 – AndyV

0

當您在控制器中獲得@users時,可以使用#select

@users = User.top.reject { |user| current_user == user or current_user.friending?(user) }.limit(10) 
+1

他在他看來使用'unless';從而拒絕符合給定條件的那些「用戶」。我想,你應該在這裏使用'reject'而不是'select'。 – kiddorails

+0

或者只是否定條件: User.top.select {| user | current_user!=用戶|| !current_user.friendling?(user)} .limit(10) – bjhaid

+0

@bjhaid在技術上,是的。但是這隻會讓第三人稱總體陳述不太清楚=>!ruby_convention。 :) – kiddorails