Tengo dos modelos, Estado y Adquisición. El estado tiene muchas adquisiciones. Sentí que una clave primaria entera autoincrementada para 51 registros era bastante tonta. Así que alteró el modelo para que el Estado sea el PK (Estado es abreviatura de dos letras; no estoy almacenar el nombre del estado real en cualquier lugar:Alterar la clave primaria en Rieles para que sea una cadena
class State < ActiveRecord::Base
self.primary_key = "state"
has_many :acquisition_histories
end
El problema es cuando creé mi modelo de Adquisición, se creó la columna de clave externa state_id como un entero Más específicamente, el script/migración generada hizo:..
class CreateAcquisitions < ActiveRecord::Migration
def self.up
create_table :acquisitions do |t|
t.date :date
t.string :category
t.text :notes
t.references :state
t.timestamps
end
end
end
estoy asumiendo que t.references tipo de datos se establece a int el problema es mi método de crear en mi Adquisición clase está tratando de poner una abreviatura de estado en el campo state_id en las adquisiciones de tabla (y sí, se llama state_id en la base de datos, aunque es ays: estado en el script de migración). El método no falla, pero pone un 0 en el campo state_id y los registros entran en el éter.
Bueno, hay una sobrecarga de base de datos (probablemente en memoria y en caché) cuando tiene que seguir incluyendo la tabla de estado para obtener el código. Pero es probable que sea una optimización excesiva. Hago eso, pero soy viejo y solía importar más en VAX 8700 días. –
Para ese tipo de cosas, tiendo a definir una constante en la clase de estado, es decir, ALL = State.all y luego uso State :: ALL como origen para los menús desplegables, etc. De esta forma, la consulta SQL solo se ejecuta al inicio en Producción . –
No me preocupa el rendimiento en absoluto, simplemente no me gusta el concepto de un identificador único adicional. Pero voy a retroceder con la convención, suponiendo que pueda encontrar la manera de respaldar todo. Soy bastante nuevo en Rails. – fr0man