【问题标题】:ActiveRecord set field to SQL expressionActiveRecord 将字段设置为 SQL 表达式
【发布时间】:2011-11-11 07:46:03
【问题描述】:

我正在使用 Ruby 1.8.7 和 Rails 2.3.8,并且有多个位置由纬度和经度表示。我正在使用 SQLite SpatiaLite 扩展将坐标转换为众所周知的二进制 (WKB) 格式。我关心的是如何让 ActiveRecord 执行插入或更新,调用适当的 SpatiaLite 转换方法。我想做这样的事情:

obj.geometry = "AsBinary(MakePoint(4, 51))"
obj.save
# ActiveRecord would now do something like:
# INSERT INTO objects (geometry) VALUES (AsBinary(MakePoint(4, 51)))

这可以通过 ActiveRecord 实现吗?

我已经尝试过 GeoRuby,但它能够正确读取 WKB blob,但无法将它们保存为与 SpatiaLite 相同的格式。

谢谢!

【问题讨论】:

  • 注意:SQLite 不适合生产环境,所以我建议切换到带有 PostGIS 扩展的 PostgreSQL。
  • @MarnenLaibow-Koser 不幸的是,我现在没有那种奢侈。我需要暂时使用 SQLite 启动并运行它。
  • 不是奢侈品。如果您没有时间安装真正的多用户数据库,那么您就没有时间开发它。很抱歉我很苛刻,但事实就是如此。
  • @MarnenLaibow-Koser 安装另一个数据库并不重要,重要的是保持许多其他明确依赖 SQLite 的软件正常工作。无论过去这是否是一个实际的决定,这些都是我现在必须处理的限制。
  • SQLite 不适合生产 Web 应用程序,因为它缺乏并发支持。如果您的生产 Web 应用程序依赖它,那将是一场等待发生的灾难。

标签: ruby-on-rails ruby activerecord spatialite


【解决方案1】:

我还没有用过GeoRuby,但是对于空间数据我用了thinking-sphinx和@geodist函数,用起来还是蛮不错的。

你可以阅读一些关于它的资源:

【讨论】:

  • 嗨,Michal,感谢您的快速回复!虽然 Thinking Sphinx 非常适合搜索,但我正在尝试在此处以非常特定的格式插入数据。据我所知,Thinking Sphinx 不会那样做,是吗?
  • 您说您将位置信息保存在纬度和经度中 - 使用 Sphinx 您也有这些字段,但据我所知,不支持查询 GeoRuby Point 对象。
  • 我确实有一组经纬度,但我需要将它们转换成众所周知的二进制格式。我更新了我的问题,希望现在更清楚我想要实现的目标。
  • 对于 MySQL 或 PostgreSQL,有一个 spatial_adapter gem (github.com/fragility/spatial_adapter),但我还是没有看到任何适用于 SQLite 的等效工具。
【解决方案2】:

经过几天的搜索并没有找到解决方案,我决定简单地利用原始连接来执行实际插入:

rc = ActiveRecord::Base.connection.raw_connection
rc.execute("INSERT INTO objects (geometry)
            VALUES (MakePoint(#{obj.lng}, #{obj.lat}))")

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多