Ruby on rails Ruby:比较两个数组是否匹配,并按DESC顺序排列结果

Ruby on rails Ruby:比较两个数组是否匹配,并按DESC顺序排列结果,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个用户模型。每个用户都有与其关联的餐厅名称。我有一个显示所有用户的视图(index.html.erb) 我想在此视图中根据当前用户和其他用户共有的餐厅数量降序排序用户。。。(事实正好相反!) 前 User1(当前用户)去过麦当劳、汉堡王、阿比 User2已经去过Ivar的 User3去过麦当劳,汉堡王 当User1加载索引视图时,用户的显示顺序为: 用户1(3/3餐厅匹配) 用户3(2/3餐厅匹配) 用户2(0/3餐厅匹配) my User.rb文件 def compare_rest

我有一个用户模型。每个用户都有与其关联的餐厅名称。我有一个显示所有用户的视图(index.html.erb)

我想在此视图中根据当前用户和其他用户共有的餐厅数量降序排序用户。。。(事实正好相反!)


User1(当前用户)去过麦当劳、汉堡王、阿比

User2已经去过Ivar的

User3去过麦当劳,汉堡王


当User1加载索引视图时,用户的显示顺序为:

用户1(3/3餐厅匹配)

用户3(2/3餐厅匹配)

用户2(0/3餐厅匹配)


my User.rb文件

def compare_restaurants
  self.restaurants.collect
end
我的用户\u controller.rb

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

只需在控制器中对它们进行排序

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
my=User.find_by_id this_User#或以任何方式获取“当前用户”
@users=User.all.-[my]).sort do | a,b|
公共_与_a=(my.restaurants&a.restaurants)。长度
公共_与_b=(my.restaurants&b.restaurants)。长度
与_a公共_与_b公共_
结束

。。。但是,如果您计划让用户开始对不同的列进行排序或大量反转排序,那么您应该使用Javascript实现排序,这样您就可以减少页面重新加载和后续数据库点击的次数。

如果您死心塌地地使用
排序依据
,那么您可以直接否定这些数字:

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\u by
来避免每次比较都计算一些昂贵的东西,并且您是在对一些非数字的东西进行排序,那么您可以始终使用
sort
和显式排序来只计算一次昂贵的东西。

@echoback感谢您的回复,但是我得到“无法将我的数据转换为数组…”将最后一行替换为
common\u和\u b common\u和\u a
以颠倒顺序。是否不能使用排序方式按描述排序“?@odpogn:如果您的
排序依据
是数字,则您可以对值求反以反转排序顺序,否则您可以在
.sort\u
之后使用
.reverse
,或者只使用
.sort
并反转比较逻辑。