INSERT и UPDATE в ruby ​​/rails с использованием функций PostgreSQL

Я использую activerecord-postgis-adapter и squeel в гео-ориентированном приложении. Извлечение данных с использованием различных запросов, основанных на поиске, и где работает нормально и squeel, позволяет мне использовать функции PostgreSQL/PostGIS для запросов, основанных на пространственных функциях и типах данных.

Однако я не могу понять, как получить доступ к аналогичным функциям при выполнении INSERT и UPDATE. Скажем, я хочу сделать что-то в строке:

UPDATE object SET raster = ST_AsRaster(ST_Buffer(ST_Point(1,5),10),150, 150, '2BUI') 
where id = 12345;

Как я мог выполнить такой запрос? Squeel, похоже, даже не поддерживает другие запросы, кроме SELECT.

В идеальном мире я бы даже хотел, чтобы типы данных Rgeo автоматически конвертировались при использовании в запросах UPDATE, так же как и с запросами where.

Я знаю, что могу вернуться к

ActiveRecord:: Base.connection.execute

, но лучше избегать этого, если кто-то не скажет мне, что это единственный способ.

-ra

2 ответа

Вы можете создать соединение с базой данных для каждой модели, с которой вы работаете. один метод, который вы можете запустить, это select_value Метод, есть другие:

sql = "UPDATE object SET raster = ST_AsRaster(ST_Buffer(ST_Point(1,5),10),150, 150, '2BUI') where id = 12345;"
conn = ModelName.connection
conn.select_value(sql)

должен запустить вашу команду

см. этот пост Даниэля Азумы для получения дополнительной информации об этом: http://blog.daniel-azuma.com/archives/216

Вы могли бы предположительно поместить этот тип кода в миграцию. На самом деле это, вероятно, лучшая практика.

update_allпринимает параметр массива, чтобы вы могли, например, сделать:

      SomeClass
  .where(id: 123)
  .limit(1)
  .update_all(
    ["some_field = some_pg_func(?, ?)", "some", "values"]
  )

https://api.rubyonrails.org/v7.0.4/classes/ActiveRecord/Relation.html#method-i-update_all

Другие вопросы по тегам