我想通过对象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
感谢您的帮助。
答案 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"]