Как правильно установить значение позиции (поле геометрии в postgresql), используя ruby ​​на рельсах? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть спотовая таблица со следующей структурой в моей схеме ruby ​​on rails:

  create_table "spots", id: :serial, force: :cascade do |t|
    t.integer  "users_id",                 null: false
    t.string   "name",       default: "",  null: false
    t.float    "lat",                      null: false
    t.float    "long",                     null: false
    t.datetime "created_at",               null: false
    t.datetime "updated_at",               null: false
    t.boolean  "is_active",  default: true
    t.boolean  "is_deleted", default: false
    t.geometry "position",   limit: {:srid=>4326, :type=>"st_point"}
    t.geometry "geom",       limit: {:srid=>0, :type=>"geometry"}
  end

Эта схема генерирует следующую структуру в PostgreSQL:

CREATE TABLE public.spots
(
    id integer NOT NULL DEFAULT nextval('spots_id_seq'::regclass),
    users_id integer NOT NULL,
    name character varying COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    lat double precision NOT NULL,
    "long" double precision NOT NULL,
    created_at timestamp without time zone NOT NULL,
    updated_at timestamp without time zone NOT NULL,
    is_active boolean DEFAULT true,
    is_deleted boolean DEFAULT false,
    "position" geometry(Point,4326),
    geom geometry
);

Тогда у меня естьВ конечной точке, где я создаю New Spot, я уже выполняю эту задачу со следующим кодом:

def __new_spot()
    begin
        @spot = Spot.new(
            name: @data["data"]["name"],
            lat: @data["data"]["latitude"],
            long: @data["data"]["length"],
            users_id: @current_user.id
        )

        if @spot.valid?
            @spot.save()
            spot_geom = ExecuteSql.run "UPDATE spots set geom =  ST_SetSRID(ST_MakePoint(#{@data["data"]["length"]}, #{@data["data"]["latitude"]}),4326) where id = #{@spot.id}"
            spot_position = ExecuteSql.run "UPDATE spots set position =  ST_SetSRID(ST_MakePoint(#{@data["data"]["length"]}, #{@data["data"]["latitude"]}),4326) where id = #{@spot.id}"

        else
            errors = []
            for err in spot.errors.messages
                errors.push({err.first => err.last})
            end

            raise errors
        end
    rescue => exception
        return raise exception
    end
end

Это хорошо работает, но не элегантно, поэтому есть лучший способ установить позицию (а также geomзначение) непосредственно в создании Spot? без использования необработанного запроса. Я нашел похожий вопрос, связанный с здесь , но делаю то же самое (не изящно) (еще одна дополнительная опция помимо выполнения триггера)

Заранее спасибо за любую помощь

...