簡體   English   中英

在Rails中的文本字段中自然排序

[英]Natural sorting in a text field in Rails

我有一個相冊列表如下:

"Day 10 - Kblah"
"Day 9 - Lblah"
"Day 8 - Sblah"
"Day 7 - Ublah"
"Day 6 - Sblah"
"Day 5 - Cblah"
"Day 4 - Gblah"
"Day 3 - Sblah"
"Day 2 - Dblah"
"Day 1 - Hblah"
"Another album"
"Some more albums"

當我按照標題對它們進行排序時,我最終得到:

"Another album"
"Day 1 - Hblah"
"Day 10 - Kblah"
"Day 2 - Dblah"
"Day 3 - Sblah"
"Day 4 - Gblah"
"Day 5 - Cblah"
"Day 6 - Sblah"
"Day 7 - Ublah"
"Day 8 - Sblah"
"Day 9 - Lblah"
"Some more albums"

我希望他們在哪里:

"Another album"
"Day 1 - Hblah"
"Day 2 - Dblah"
"Day 3 - Sblah"
"Day 4 - Gblah"
"Day 5 - Cblah"
"Day 6 - Sblah"
"Day 7 - Ublah"
"Day 8 - Sblah"
"Day 9 - Lblah"
"Day 10 - Kblah"
"Some more albums"

我基本上想要對標題進行自然排序,但是按照字母順序自然排序。 是否有任何類型的寶石可以正確地為我做這個?

親切的問候,尼爾

我知道沒有寶石可以自動解決這個問題。 我想,一般來說解決這個問題是相當困難的。

但是,如果問題不是通用的,那么它可能是可行的。

它首先將塊傳遞給排序:

array.sort do |a, b|
  # return -1, 0 or 1 in this block, usually done via the <=> operator
end

您可能想要離開“Day”部分:

DAY_REGEX = /^Day (\d+) -/

array.sort do |a, b|
  if is_day?(a) && is_day(b)
    value_of_day(a) <=> value_of_day(b)
  else
    a <=> b
  end
end

def is_day?(str)
  str =~ DAY_REGEX
end

def value_of_day(str)
  DAY_REGEX.match(str)[1].to_i
end

我知道,它是黑客和丑陋的。 但是,如果你找不到合適的解決方案,我希望它會激勵你如何自己解決這個問題。

編輯:可能更改技術以讀取類似: contains_numbers 寫一些測試來執行以下操作:當字符串中直到第一個名稱的部分在兩個字符串中都相同時,然后刪除它們,轉換數字,並對其進行排序。

你是如何生成相冊名單的? 你能回到那一步並計算那里的排序嗎? (例如,它們是從用戶相冊的數據庫表中提取的嗎?)。 或者使用由可排序的東西索引的專輯名稱散列替換數組,然后對鍵進行排序並按照該順序從散列中檢索值。

謝謝你的回復。 我設法找到一個創造奇跡的寶石。 它被稱為NaturalSorter,我只是在我的控制器中的@albums實例變量上調用它來按標題對它們進行排序,然后將它傳遞給視圖。

親切的問候,尼爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM