5

Estoy usando un modelo de STI con una sola tabla de "Cuentas" para contener información para usuarios y técnicos (es decir, usuario < Cuenta, técnico < Cuenta) Todo funciona desde una perspectiva funcional, pero las cosas explotar cuando se ejecutan las pruebas de unidad:Ruby on Rails Herencia de tabla única (STI) y problema de prueba de unidad (con PostgreSQL)

... 8) Error: test_the_truth (UserTest): ActiveRecord :: StatementInvalid: PGError: ERROR: "técnicos" de relación no existe : CANCELACIÓN de "técnicos" ...

en esencia, el marco central no reconoce que los técnicos y usuarios tablas (o "relaciones", como los llama PostgreSQL) no existen y, de hecho, debe tener un alias para Cuentas.

¿Alguna idea? Soy relativamente nuevo en RoR y no sé cómo solucionarlo sin arrancar a STI todos juntos.

+0

¿Se puede publicar tanto la prueba unitaria que está generando el error como el método al que llama cuando ocurre el error? –

Respuesta

12

Resulta que el problema se debía a la presencia de:

./test/fixtures/technicians.yml ./test/fixtures/users.yml

Esto tiene sentido ya que la marco esperado para poder insertar datos en tablas con nombres similares.

+1

<3 desbordamiento de pila. ¡Ojalá pudiera modifiquártelo más! – nfm

0
  • ¿Se aseguró de que su tabla de cuentas incluya una columna 'tipo'? Necesitas uno para hacer que STI funcione.
  • En realidad, tuve algunos problemas de compatibilidad de bases de datos con una columna llamada 'tipo' y ocasionalmente cambié a 'tipo' para aliviar eso. Eso podría ser el problema; intente establecer self.inheritance_column = "kind" en la clase base (Account) y vea si eso ayuda.
+0

Las cuentas incluyeron una columna "tipo" y, desafortunadamente, su sugerencia de cambiar su nombre a "tipo" no ayudó; los problemas persisten –

2

Tuve un problema similar que se resolvió al eliminar el archivo YAML para el modelo hijo. Básicamente rails está mirando los dispositivos creados en/test/fixtures/y tratando de vaciar las tablas de cada uno para que pueda recargarlos por usted.

En mi caso había ejecutado el comando script/generate model que crea automáticamente un nuevo accesorio. Luego cambié el modelo para heredar de la clase padre adecuada. Bueno, dado que el accesorio aún existía, Rails estaba tratando de ELIMINAR DE niño antes de cargar los accesorios.

Si realmente necesita cargar datos previamente, debe usar el accesorio de modelos originales y establecer el campo de tipo en el nombre del modelo adecuado.

Cuestiones relacionadas