2

我想按对象 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

4 回答 4

4

您可以使用 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] }
于 2012-06-05T15:46:28.760 回答
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)
于 2012-06-05T15:28:22.327 回答
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)
于 2012-06-05T15:30:05.210 回答
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"]
于 2015-01-27T20:01:22.517 回答