Rails如何根据"磁盘大小"存储为字符串的值?

时间:2016-10-18 06:31:02

标签: mysql ruby-on-rails

我使用MySql作为后端创建了Rails 5应用程序。
我有" Server"模型与" disk_size" field和disk_size字段是varchar,值存储为" 10 GB"," 512 MB"。我想通过disk_size字段按升序排序订单数据,例如" 512 MB"," 10 GB"。

1 个答案:

答案 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)