在范围查询轨道内使用特定方法

时间:2020-07-24 16:14:14

标签: ruby-on-rails ruby activerecord

我的数据库中有一个名为device的东西 我想从数据库设备中提取语义版本大于/等于“ 1.2.42”,并且设备状态是否在线

我有方法

def check_sem_ver
    basic_sem_version = "1.2.42"
    device_base_ver = Device.harware_info["software-version"].split("-").first
    return Gem::Version.new(device_base_ver) >= Gem::Version.new(basic_sem_version)
end

我还有一个名为

的范围

scope :proper_sem_version, -> { where(online-status: 'online).and(check_sem_ver) }

但这不起作用,仅当check_sem_ver为真时,如何才能从数据库中提取内容? 不幸的是,像where(software-version > '1.2.42')之类的基本数学无法正常工作,因为version是带有-的字符串,如您所见,我必须拆分才能摆脱。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

要对版本字符串进行预期的比较,需要将它们转换为数组。

如果您使用的是Postgres,则可以构建如下范围:

BasicSemVersion = "1.2.42"

def query_threshold
  BasicSemVersion.split('.').join(',')
end

scope :proper_sem_version, -> { where("online-status='online' and string_to_array(software-version,'.')::int[]>=ARRAY[#{query_threshold}]") }