Estoy trabajando con una base de datos sobre la que no tengo control y no puedo modificarla. Esta base de datos tiene una tabla llamada warehouse_items . Cada artículo del almacén se identifica de forma única mediante una clave principal que indica la identificación del artículo.
Desafortunadamente, ese atributo de clave principal se llama WAREHOUSE_ITEM.ID
(Tenga en cuenta el punto desagradable entre "elemento" e "id")
Cuando trato de ejecutar una consulta básica, como:
WarehouseItem.find('wh3453')Recibo un error de tabla indefinida .
Afortunadamente, al observar lo que Rails intenta hacer, el problema se vuelve obvio:
: SELECT "warehouse_items".* FROM "warehouse_items" WHERE "WAREHOUSE_ITEM"."ID" = $1 LIMIT $2Debido al punto en el nombre del atributo, Rails trata "WAREHOUSE_ITEM.ID" como una combinación de tabla/atributo, en lugar de un nombre de atributo con un punto.
Cuando ejecuto la siguiente consulta PSQL a mano, obtengo exactamente lo que necesito:
SELECT "warehouse_items".* FROM "warehouse_items" WHERE "warehouse_items"."WAREHOUSE_ITEM.ID" = 'wh3453'¿Por qué Rails está arruinando esto y cómo puedo solucionarlo?
EDITAR:
También vale la pena señalar: he intentado usar self.primary_key para anular la clave principal sin éxito.
Probé tanto una cadena como un símbolo, como en:
self.primary_key="WAREHOUSE_ITEM.ID"y
self.primary_key=:"WAREHOUSE_ITEM.ID"ninguno ha trabajado...
¡Gracias a todos por la ayuda!
¡Una sugerencia en los comentarios para usar find_by_sql funciona! Sin embargo, me topé con una solución diferente que funciona aún mejor.
Primero, asigné un alias al molesto nombre del atributo a algo simple: id
alias_attribute :id, :"WAREHOUSE_ITEM.ID"Tenga en cuenta que sigue siendo un símbolo, lo cual es importante para el siguiente paso.
Luego sobrescribo el método primary_key con una función personalizada:
def self.primary_key return "id" end Ahora, cuando hago WarehouseItem.find('wh3453') , Rails por defecto comprueba id , que tiene el alias del símbolo correcto y funciona según lo previsto.