2011-02-18 50 views
2

我有一個用戶模型。每個用戶都有與其關聯的餐廳名稱。我有一個顯示所有用戶的視圖(index.html.erb)。Ruby:比較兩個數組的匹配,並按DESC順序排列結果

我想基礎上,CURRENT_USER和其他一些用戶有多少餐館有共同按降序排序該視圖中的用戶...(它相反!)


前。

用戶1(CURRENT_USER)一直以麥當勞,漢堡王,阿拜的

用戶2已經到了Ivar的

用戶3一直以麥當勞,漢堡王


當用戶1加載索引查看,用戶應該顯示的順序是:

用戶1(3/3餐館匹配)

用戶3(2/3餐館匹配)

用戶2(0/3餐館匹配)


我User.rb文件

def compare_restaurants 
    self.restaurants.collect 
end 

我users_controller.rb

def index 
    @users = User.all.sort_by {|el| (el.compare_resturants & current_user.compare_resturants).length } 
end 

回答

4

如果你使用sort_by那麼你可以否定的數字死心塌地:

def index 
    @users = User.all.sort_by { |el| 
    -(el.compare_resturants & current_user.compare_resturants).length 
    } 
end 

這招只適用,因爲你通過數值排序。如果你對字符串進行排序,那麼你不得不使用這樣的事情:

reverse_sorted = a.sort_by { |x| something(x) }.reverse 

但會涉及陣列和reverse會做額外工作的額外副本。在這種情況下,您應該使用具有反向比較邏輯的完整sort

如果你試圖使用sort_by避免計算每個比較昂貴的東西,你是排序的東西非數字,那麼你總是使用sort有一個明確的Schwartzian Transform計算昂貴的東西只有一次。

0

只需在控制器中對它們進行排序即可。

my = User.find_by_id this_user # Or however you're getting "the current user" 
@users = User.all.-([my]).sort do |a, b| 
    common_with_a = (my.restaurants & a.restaurants).length 
    common_with_b = (my.restaurants & b.restaurants).length 
    common_with_a <=> common_with_b 
end 

...但如果你是在讓用戶開始排序各列或逆轉分揀大量的規劃,你應該實現你在Javascript中的排序,所以你可以在頁面重載的數量減少和隨後的數據庫命中你必須做。

+0

@echoback感謝您的回覆,但是我得到了「不能轉換成陣列..」 – thedeepfield 2011-02-18 04:53:53

相關問題