我使用MySql作为后端创建了Rails 5应用程序。
我有" Server"模型与" disk_size" field和disk_size字段是varchar,值存储为" 10 GB"," 512 MB"。我想通过disk_size字段按升序排序订单数据,例如" 512 MB"," 10 GB"。
答案 0 :(得分:1)
我认为这会在计算字符串的大小时产生大量溢出。另外,你不能使用sql来订购这些更快的东西。
更好的方法是将它们以字节存储,这样它就是一个可以排序的整数。
如果您想要打印尺寸,可以使用number_to_human_size
帮助器。请参阅docs
E.g。
irb(main):003:0> size = 10_000_000
=> 10000000
irb(main):004:0> number_to_human_size(size)
=> "10 MB"
编辑:
根据Andrey Deineko的说法,这不是答案。
所以这是ruby方式(没有非常非常长的sql查询来解决这个问题):
例如,构建一个名为“FileSize”的类(您可以将其放在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
使用您拥有的所有单位完成UNITS
常量。
如果您使用的是ActiveRecord,则可以覆盖模型的吸气剂:
class MyModel < ApplicationRecord
def disk_size
FileSize.new(super)
end
end
所以你可以这样做:
MyModel.where(something: "is").sort_by(&:disk_size)