Ruby on rails RubyonRails:查询Rails模型以获取浮点属性的特定精度
在我的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位小数和纬度为
id <int>
name <string>
longitude float
latitude float
id
名称
经度浮动
纬度浮动
问题是,我们并没有对纬度/经度属性强制执行任何精度/比例标准。因此,有些地方的经度和纬度可能都大于/小于小数点后6位
我想找到以特定的纬度/经度精度保存的所有位置。大概是这样的:
- 获取经度为小数点后5位的所有位置
- 获取纬度为小数点后7位的所有位置
- 获取经度为4位小数和纬度为8位小数的所有位置
- 等
另外,我正在使用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)
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::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页:(