2011-02-18 52 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

相关问题