gpt4 book ai didi

ruby-on-rails - 保存前如何在 Rails 中使用 ST_GeoHash 和 ST_MakePoint postgis 函数?

转载 作者:行者123 更新时间:2023-11-29 14:20:46 27 4
gpt4 key购买 nike

如何在 Rails 中构建 postgis 点,然后在将响应发送给客户端之前进行 geohash 并将它们保存到数据库中?我想通过 ST_MakePointST_GeoHash 函数来实现,我更愿意避免通过 [0]["st_makepoint"] 执行 SQL 和提取数据>,如果有可能如何插入这个函数以在插入所有属性时自动执行它们?我已经安装了 squeel gem,也许我可以将这个函数合并到查询中吗?

我当前的 Rails 代码:

before_save :set_geopoint
def set_geopoint
#attributes -> {"latitude" => 51.90,"longitude" => 16.42,"geopoint" => nil}
#self.geopoint = "ST_MakePoint(#{latitude}, #{longitude})")" #not working
#self.geopoint = ActiveRecord::Base.connection.execute("SELECT ST_MakePoint(#{latitude}, #{longitude})")[0]["st_makepoint"]
#self.geohash = "ST_GeoHash(#{self.geopoint})"
#self.geohash = ActiveRecord::Base.connection.execute("SELECT ST_GeoHash(ST_SetSRID(#{self.geopoint},4326),5);").first["st_geohash"]
end

我在触发函数之前通过 SQL 完成了它,但我仍在寻找 Rails 方法。

CREATE FUNCTION geopoint_trigger() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO posts( geopoint ) VALUES( ST_GeomFromText('POINT(' || NEW.latitude || ' ' || NEW.longitude || ')') );
RETURN NEW;
END;
$$
LANGUAGE 'plpgsql';

最佳答案

要生成可以保存在支持 postgis 的数据库中的点,您需要使用工厂生成该点。你在这里做什么:

self.geopoint = "ST_MakePoint(#{latitude}, #{longitude})")" #not working

只是将 self.geopoint 设置为一个字符串并尝试保存它。由于您的数据库地理点字段(我假设)设置为接受一个点,因此失败。

我建议您使用 rgeo gem 将地理工厂添加到您的模型中。将它添加到您的 Gemfile

https://github.com/rgeo/rgeo

您需要确保在您的迁移中,您使用的是点作为这样的列类型:

t.point :geopoint, geographic: true

在您的 Post 模型中,您需要像这样指定一个工厂:

RGEO_FACTORY = RGeo::Geographic.spherical_factory(srid: 4326)

并且您还需要告诉 rgeo 在您的 geopoint 列上使用什么工厂。

set_rgeo_factory_for_column :geopoint, RGEO_FACTORY

现在在您的 before_save 中,只需执行以下操作:

self.geopoint = RGEO_FACTORY.point(latitude, longitude)

它应该可以工作...

编辑

例如,如果您想在 Rails 模型中使用 Postgis 函数来获取 GeoHash,那么您可以这样做:

post_geohash = Post.select("ST_GeoHash(geopoint) as geohash").where(id: some_post_id).geohash

您还可以创建一个在您的 Post 模型上执行此操作的实例方法:

def geohash
Post.select("ST_GeoHash(geopoint) as geohash").where(id: id).geohash
end

不确定这是否有效,因为它未经测试,但您明白了。

关于ruby-on-rails - 保存前如何在 Rails 中使用 ST_GeoHash 和 ST_MakePoint postgis 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28129857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com