¿Cómo define las funciones postgres en Rails y cuál es su scope y duración?

No sé nada acerca de las funciones de Postgres, sin embargo, la necesidad de usarlas ha surgido un par de veces recientemente (esto puede ser indicativo de que estoy abordando el problema de manera incorrecta, pero independientemente …)

Me gustaría definir una función de Postgres como esta a la que luego accederé mediante consultas en mi aplicación Rails:

CREATE FUNCTION date_in_time_zone(time_zone) RETURNS date AS 'SELECT DATE(NOW() AT TIME ZONE time_zone);' LANGUAGE SQL; 

(de esta pregunta ).

Pregunta parte 1: ¿Cómo defino esta función?

Supongo que lo haría de la siguiente manera:

 sql = "CREATE FUNCTION date_in_time_zone(time_zone) RETURNS date AS 'SELECT DATE(NOW() AT TIME ZONE time_zone);' LANGUAGE SQL;" ActiveRecord::Base.connection.execute sql 

¿Es esto correcto?

Pregunta parte 2: ¿Cuál es el scope y la duración de esta función?

Una vez definido, cuánto tiempo dura esta función y cuál es la mejor manera de administrar la versión de esa función. Si está definido en la base de datos en lugar de en Rails, tendré que tener cuidado de destruirlo o actualizarlo si quiero cambiar cómo funciona. También necesitaré alguna forma de inicializar la función cada vez que cargue mi entorno Rails.

¿Debo crear la función una vez en la inicialización de la aplicación o debo crearla para cada solicitud web? Supongo que lo primero está definido en la base de datos, pero no estoy seguro.

Pregunta parte 3: ¿Debo usar este enfoque?

¿Es solo una mala idea? ¿Debería tratar de resolver el problema de una manera diferente? Realmente no sé cuál es el scope o la duración de estas funciones.

Una vez creada, una función en PostgreSQL se mantiene permanentemente . Al igual que otros objetos, vive dentro de un esquema y solo se encuentra si este esquema se encuentra en la search_path de search_path de su sesión actual.

En una base de datos de propósito general, crearía sus funciones en el esquema public predeterminado. En una configuración más sofisticada, es posible que tenga un esquema dedicado para funciones o un esquema dedicado por usuario. La search_path se establecerá en consecuencia.

Use CREATE OR REPLACE FUNCTION ... lugar de CREATE FUNCTION ... para que pueda reemplazar el cuerpo de una función existente (sin cambiar los tipos IN o OUT). Más sobre esto en esta respuesta reciente por @Pavel Stehule en dba.SE.

Tenga en cuenta los efectos ligeramente diferentes de los nombres de zonas horarias y las abreviaturas o las compensaciones numéricas. Preguntas / respuestas relacionadas:
Los nombres de zona horaria con propiedades idénticas producen resultados diferentes cuando se aplican a la marca de tiempo
PostgreSQL: ¿cómo representar la fecha en una zona horaria diferente?