MySqlを使用してRails 5アプリケーションをバックエンドとして作成しました。
"disk_size"フィールドを持つ "Server"モデルがあり、disk_sizeフィールドはvarcharで、値は "10 GB"、 "512 MB"のように格納されています。私は、 "512 MB"、 "10 GB"のような昇順でdisk_sizeフィールドによる注文データの結果を求めます。文字列として格納されている "ディスクサイズ"の値に基づいてデータを並べ替える方法は?
答えて
これは、文字列のサイズを計算する際にオーバーフローが発生すると思います。また、SQLを使用してこれらを注文することはできません。
より良い方法はバイト単位で格納するため、ソートできる整数になります。
サイズを印刷する場合は、number_to_human_size
ヘルパーを使用してください。 docs
などを参照してください。
irb(main):003:0> size = 10_000_000
=> 10000000
irb(main):004:0> number_to_human_size(size)
=> "10 MB"
EDIT:
アンドレイDeinekoによると、これは答えませんでした。
例えば「ファイルサイズ」という名前のクラスを作成します(あなたはapp/models/
でそれを置くことができる):
class FileSize
include Comparable
UNITS = {
"MB" => 1_000_000,
"GB" => 1_000_000_000,
# ...
}
def initialize(str)
@str = str
end
def to_bytes
count, unit = @str.split(" ")
if UNITS.key?(unit)
count.to_i * UNITS[unit]
else
raise "Don't know unit #{unit.inspect}, please specify."
end
end
def <=>(other)
to_bytes <=> other.to_bytes
end
def inspect
@str
end
def to_s
@str
end
end
だからここ
は(これを解決するために非常に非常に非常に長いSQLクエリなし)ルビー方法です
UNITS
定数にあなたが所有しているすべてのユニットを記入してください。
あなたはActiveRecordのを使用している場合は、あなたのモデルのごゲッターを上書きすることができます
class MyModel < ApplicationRecord
def disk_size
FileSize.new(super)
end
end
だから、あなたがこれを行うことができます:
MyModel.where(something: "is").sort_by(&:disk_size)
それは私が完全に同意する良い勧告ですが、それは質問への答えではありません - 列はすでに文字列です –
それは答えではありませんか? – siegy22
DBスキーマの変更を含む代替案を提案しましたが、現在の設定の解決策ではありません(この方法が理にかなっていますが)。あなたがしなければならないことは、現在の問題**と**を解決する方法を提供し、より良い方法を提案します。これがこのサイトの仕組みです。 「あなたが持っているものをすべて捨てて、このようにやり直す」という質問に答えることはできません。たとえばOPがDBスキーマを変更できないような状況があるかもしれません。そのような場合にあなたの答えはどのように適格になりますか? –
- 1. ArrayListを文字列に基づいて並べ替える
- 2. "next"フィールドに基づいてデータを並べ替える方法
- 3. その列のデータの部分文字列に基づいてTableViewを並べ替える方法
- 4. jsonarrayを価格に基づいて並べ替える
- 5. 長さに基づいて2つの次元配列を文字列で並べ替える方法は?
- 6. 複製値に基づいてPHP配列を並べ替える方法
- 7. 並べ替え優先度に基づいて並べ替え
- 8. リストの並べ替えオブジェクト内の文字列配列に基づいて
- 9. 文字列として格納された数値のRデータテーブル列のカスタム並べ替え
- 10. 文字列として格納されていても整数の並びとしてソートされたフィールドによる並べ替え
- 11. フィールドに基づいてJsonデータを並べ替える
- 12. 配列の状態に基づいて配列を並べ替える方法
- 13. 配列をPHPのキーに基づいて並べ替える
- 14. SQL「注文」フィールドに基づいて子行を並べ替える方法は?
- 15. json値に基づいてdivを並べ替える方法は?
- 16. 文字列内の文字に基づいて文字列を並べ替える
- 17. 別の配列のデータに基づいて配列を並べ替える
- 18. 入力に基づいて配列を並べ替える
- 19. チェックされた値に基づいてデータのIDを格納する方法または(すべて)
- 20. 値に基づいた並べ替え
- 21. 元のExcelシートの並べ替え順に基づいてExcelシートを並べ替える方法は?
- 22. D3 - データに基づいて要素を並べ替えます
- 23. 配列の長さに基づいて配列を並べ替える
- 24. PyQt:QTableView列(文字列と数値)を並べ替える方法
- 25. ソートに基づいてReactとFilterで並べ替える方法は?
- 26. 複数の値に基づいて配列を並べ替える
- 27. ruby - 別の配列に基づいて配列を並べ替えるには?
- 28. 360度に基づいて配列を並べ替え
- 29. 正確な値に基づいて配列を並べ替える
- 30. 文字列の一部に基づいて文字列のベクトルを並べ替えます(RIGHT)。
これはhttp://stackoverflow.com/questionsを助けます/ 4605627/how-to-sort-mysql-coloumn-that-has-data-in-bytes-kb-mb-gb。 – dnsh