如何使用rails

时间:2018-04-22 12:47:04

标签: mysql ruby-on-rails where-clause

我们假设我有一个名为Position的导轨模型和两列latitudelongitude(都定义为float)。我已经使用一些位置值填充了模型。现在我试图根据它的纬度找到位置:

positions = Position.where('positions.latitude = ?', 50.0)

返回nil。 即使我试试这个:

lat = Position.first.latitude
positions = Position.where('positions.latitude = ?', lat)

结果是零。我的数据库是mysql用于生产。开发中的单词代码(sqlite)。我的假设是它与如何处理数据类型有关,但我没有得到它。有人有什么想法吗?

2 个答案:

答案 0 :(得分:2)

当您需要精确的数值时,请勿使用FLOATDOUBLE

阅读https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html

相反,请使用DECIMALNUMERIC(他们是同义词)。

有关用于纬度和经度的特定DECIMAL精度的一些指导,请参阅How accurately should I store latitude and longitude?

答案 1 :(得分:1)

这可能是由于如何表示浮点数。通过使用正常的相等比较来比较它们是不可能的。而不是检查完全匹配,最好在比较它们之前检查数字是否在一个范围内或将两个数字四舍五入到一定的精度。

关于具有地理坐标的特定示例(我假设这是因为使用了纬度),我建议使用十进制列类型而不是浮点数。

如果您想坚持使用floatcolumn,我可以建议检查该值是否在一个范围内。