2

オブジェクトの配列をオブジェクト last_name で並べ替えたいのですが、常に特定のオブジェクトを配列の最初の位置に配置します。それを達成するために、私はすでに多くのことを試みましたが、結果として得られる配列の構造で常に失敗しました。結果の配列オブジェクトでメソッドを実行できないために失敗した私の試みの1つを次に示します(@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

Rubyよりも高速にSQLのORDER BY機能を使用できます(ところで、使用する必要があります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

質問のタイトルに答える:「例外を使用して配列をソートする」:

ここでの例外は 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 に答える
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

これを試して:

@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 に答える