Ruby on rails RubyonRails:查询Rails模型以获取浮点属性的特定精度

Ruby on rails RubyonRails:查询Rails模型以获取浮点属性的特定精度,ruby-on-rails,ruby-on-rails-4,activerecord,floating-point,precision,Ruby On Rails,Ruby On Rails 4,Activerecord,Floating Point,Precision,在我的Rails应用程序中,我有一个位置表,其结构如下 id <int> name <string> longitude float latitude float id 名称 经度浮动 纬度浮动 问题是,我们并没有对纬度/经度属性强制执行任何精度/比例标准。因此,有些地方的经度和纬度可能都大于/小于小数点后6位 我想找到以特定的纬度/经度精度保存的所有位置。大概是这样的: 获取经度为小数点后5位的所有位置 获取纬度为小数点后7位的所有位置 获取经度为4位小数和纬度为

在我的Rails应用程序中,我有一个位置表,其结构如下

id <int>
name <string>
longitude float
latitude float
id
名称
经度浮动
纬度浮动
问题是,我们并没有对纬度/经度属性强制执行任何精度/比例标准。因此,有些地方的经度和纬度可能都大于/小于小数点后6位

我想找到以特定的纬度/经度精度保存的所有位置。大概是这样的:

  • 获取经度为小数点后5位的所有位置
  • 获取纬度为小数点后7位的所有位置
  • 获取经度为4位小数和纬度为8位小数的所有位置
有人能建议如何使用Rails活动记录执行这样的查询吗


另外,我正在使用PostgreSQL v9.4.14

尝试以下方法获取所有经度为小数点后5位的位置

Place.all.collect{|p| p if p.longitude.to_s.include?('.') && p.longitude.to_s.split('.').last.length == 5}

还有相同的剩余逻辑。

尝试以下方法获得所有经度为小数点后5位的位置

Place.all.collect{|p| p if p.longitude.to_s.include?('.') && p.longitude.to_s.split('.').last.length == 5}

剩余部分的逻辑也相同。

当您使用Postgre时,
scale
将返回小数部分的小数位数。您可以定义如下范围:

class Place < ApplicationRecord
  scope :with_longitude_scale, -> (scale_limit) { where('scale(longitude) = ?', scale_limit) }
  scope :with_latitude_scale, -> (scale_limit) { where('scale(latitude) = ?', scale_limit) }
end
上课地点(刻度限制){where('scale(longitude)=?',刻度限制)}
范围:具有(纬度)刻度,->(刻度)极限{式中((刻度(纬度)=?',刻度(极限)}
结束
现在,您可以轻松地查询模型(也可以根据需要链接它们)以返回所有相关记录

  • 获取所有经度为小数点后5位的位置:
    Place.with_longitude\u scale(5)
  • 获取经度为4位小数位的所有位置和纬度为8位小数位的所有位置:
    位。使用经度刻度(4)。使用纬度刻度(8)

当您使用Postgre时,
scale
将返回小数部分的小数位数。您可以定义如下范围:

class Place < ApplicationRecord
  scope :with_longitude_scale, -> (scale_limit) { where('scale(longitude) = ?', scale_limit) }
  scope :with_latitude_scale, -> (scale_limit) { where('scale(latitude) = ?', scale_limit) }
end
上课地点(刻度限制){where('scale(longitude)=?',刻度限制)}
范围:具有(纬度)刻度,->(刻度)极限{式中((刻度(纬度)=?',刻度(极限)}
结束
现在,您可以轻松地查询模型(也可以根据需要链接它们)以返回所有相关记录

  • 获取所有经度为小数点后5位的位置:
    Place.with_longitude\u scale(5)
  • 获取经度为4位小数位的所有位置和纬度为8位小数位的所有位置:
    位。使用经度刻度(4)。使用纬度刻度(8)

不确定是否使用ActiveRecord,但是ruby确实可以帮助你检查每一条记录。你使用什么数据库?为什么要按精度查询位置?@PavelMikhailyuk使用PostgreSQL@AnaMaraMartínezGómez这是我清理Places记录的第一步,首先要了解我有多少坏数据。不确定使用ActiveRecord,但是ruby确实可以帮助你检查每一条记录。你使用什么数据库?为什么要按精度查询位置?@PavelMikhailyuk使用PostgreSQL@AnaMaraMartínezGómez这是我清理Places记录的第一步,首先了解我有多少坏数据。听起来不错。但是我得到了这个错误
ActiveRecord::StatementInvalid:PG::UndefinedFunction:error:function scale(双精度)不存在
提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。
可以建议其他方法吗?对PG来说有点陌生。我尝试了
Place.where(“scale(cast(经度为数字))=6”)。count
看起来像
scale
是由PostgreSQL v9.6以后的版本支持的。我正在使用PG 9.4:(听起来不错。但是我得到了这个错误
ActiveRecord::StatementInvalid:PG::UndefinedFunction:error:function scale(双精度)不存在
提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
可以建议一种替代方法吗?对第页来说有点新。我尝试了
Place.where(“比例(转换(经度为数字))=6”).count
看起来像是
scale
受PostgreSQL v9.6及以后版本的支持。我使用的是第9.4页:(