2

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

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

但是,对于距离计算等...我将位置数据作为空间点存储在数据库中。

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

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

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

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

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

4

2 回答 2

3

查看Rails 的 geokit-rails 插件,它使用普通的 lat/lng 列作为浮点数进行距离计算(并使用geokit gem)。但是,如果您想使用数据库的地理空间功能,GeoRuby支持将 Point 或 LineString 等基本空间功能作为列类型。我希望这些帮助。

于 2009-07-21T20:52:51.083 回答
0

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

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

触发器不好,数据库应该传递数据但不做逻辑。

于 2009-07-21T21:00:39.367 回答