关于 mysql 空间数据类型有很多问题,但是我的更具体的是如何 最好的 在 Rails MVC 架构中处理它们。

我有一个输入表单,管理员用户可以在其中创建新的兴趣点(例如餐厅)并输入一些信息。他们还可以以十进制格式输入人类可读的纬度和经度。

然而,对于距离计算等......我将位置数据存储为数据库中的空间点。

因此,我的问题是,如何在 Rails 的 MVC 架构中最好地处理这个问题?

以下是我的一些想法,但似乎没有什么是真正干净的:

  • 调用 :after_filter 方法,该方法采用对象的新实例并执行原始 SQL 更新来处理“GeomFromText('POINT(lat long)' ))”优点。问题是“纬度/经度”将是我创建表单中的文本字段,尽管这破坏了 Rails 提供的干净的 form_for :object 架构,因为纬度/经度并不是真正的属性,它们只是为了让不是 mysql 空间的人工输入值。

  • 也许在数据库中创建一个触发器以在更新该行的行插入后运行?我不知道,而且这些触发器似乎无法访问纬度/经度,除非我存储纬度/经度以及空间点,然后使用纬度/经度小数在数据库中创建行,然后在创建后运行触发器来更新空间。我想如果我将纬度/经度列添加到模型中,我也可以使用 after_filter 来做到这一点。

还有其他想法吗?我认为存储纬度/经度是多余的,因为我真的会使用空间点进行距离计算等......但如果我允许人工编辑,这可能是必要的。

有帮助吗?

解决方案

查看 Rails 的 geokit-rails 插件 它使用普通的 lat/lng 列作为浮点数进行距离计算(并使用 地质工具包 宝石)。但是,如果您想使用数据库的地理空间功能, 地质红宝石 支持点或线串等基本空间特征作为列类型。我希望这些有所帮助。

其他提示

我同意绝望,geokit很好,我也用它。

如果你想自己做,我会做一个 after_filter 但将更新方法外部化到一个线程。就像这样,您在保存时不会减慢速度,但仍然有很好的代码和及时更新的列。

触发器不好,数据库应该传递数据而不是执行逻辑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top