Ruby:使用异常对数组进行排序

时间:2012-06-05 15:22:37

标签: ruby-on-rails ruby sorting

我想通过对象last_name对对象数组进行排序,但始终将某个对象放在数组的第一个位置。 为了实现这一点,我已经尝试了很多,但总是失败了结果的数组结构。这是我的一次尝试失败,因为我无法在生成的数组对象上运行任何方法(例如@team.each do |m| puts m.username end失败):

if @team = UserGroup.find_by_name("team").users.sort_by(&:last_name)
  if first_member = @team.detect{|m| m.username == "test"}
    @team.unshift @team.reject{|m| m.username == "test"}
  end
end

感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

你可以使用SQL的ORDER BY功能,比Ruby更快(顺便说一句,你应该使用find_by_attribute!)。未经测试,但玩这样的东西:

@team = UserGroup.find_by_name!("team").users.
  order("username = 'test' DESC, last_name ASC")

当然,您可以使用相同的想法来使用Ruby:

@team = UserGroup.find_by_name!("team").users.
  sort_by { |u| [u.username == 'test' ? 0 : 1, u.last_name] }

答案 1 :(得分:1)

试试这个:

@team = UserGroup.find_by_name("team").users.sort_by(&:last_name)
first_member = @team.select{|m| m.username == "test"}
@team = first_member + (@team - first_member)

答案 2 :(得分:1)

如果我理解你的话,这应该有效:

@team = UserGroup.find_by_name("team").users.sort_by(&:last_name)
test=nil
@team=@team.delete_if {|obj| obj.username == "test" ? (test=obj; true) : false}
@team.insert(0, test)

答案 3 :(得分:1)

回答问题的标题:"排序一个带例外的数组":

这里的例外是13,所以它总是最高等级:

(1..15).to_a.shuffle.sort { |a,b| a == 13 ? -1 : b == 13 ? 1 : a <=> b }
输出irb:

=> [13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15]
如果需要,

也可以使用用户名:

%w{mike bob mario toad test}.sort {|a,b| a == 'test' ? -1 : b == 'test' ? 1 : a <=> b }
=> ["test", "bob", "mario", "mike", "toad"]