У меня есть спотовая таблица со следующей структурой в моей схеме 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? без использования необработанного запроса. Я нашел похожий вопрос, связанный с здесь , но делаю то же самое (не изящно) (еще одна дополнительная опция помимо выполнения триггера)
Заранее спасибо за любую помощь