sql >> Base de Datos >  >> RDS >> PostgreSQL

Cambiar un tipo de columna a cadenas más largas en rieles

Deberías usar text con Rails si desea una cadena sin límite de longitud. Una migración como esta:

def up
  change_column :your_table, :your_column, :text
end
def down
  # This might cause trouble if you have strings longer
  # than 255 characters.
  change_column :your_table, :your_column, :string
end

debería arreglar las cosas. Es posible que desee :null => false o algunas otras opciones al final de eso también.

Cuando usas una string columna sin un límite explícito, Rails agregará un :limit => 255 implícito . Pero si usas text , obtendrá cualquier tipo de cadena de longitud arbitraria que admita la base de datos. PostgreSQL le permite usar un varchar columna sin una longitud, pero la mayoría de las bases de datos usan un tipo separado para eso y Rails no conoce varchar sin longitud. Tienes que usar text en Rails para obtener un text columna en PostgreSQL. No hay diferencia en PostgreSQL entre una columna de tipo text y uno de tipo varchar (pero varchar(n) es diferente). Además, si está implementando sobre PostgreSQL, no hay razón para usar :string (También conocido como varchar ) en absoluto, la base de datos trata text y varchar(n) lo mismo internamente excepto por las restricciones de longitud extra para varchar(n); solo debes usar varchar(n) (También conocido como :string ) si tiene una restricción externa (como un formulario del gobierno que dice que el campo 432 en el formulario 897/B tendrá 23 caracteres) en el tamaño de la columna.

Aparte, si está utilizando una string columna en cualquier lugar, siempre debe especificar el :limit como un recordatorio para usted mismo de que hay un límite y debe tener una validación en el modelo para garantizar que no se exceda el límite. Si excede el límite, PostgreSQL se quejará y generará una excepción, MySQL truncará silenciosamente la cadena o se quejará (según la configuración del servidor), SQLite lo dejará pasar tal cual y otras bases de datos harán otra cosa (probablemente se quejen) .

Además, también debe desarrollar, probar e implementar sobre la misma base de datos (que generalmente será PostgreSQL en Heroku), incluso debe usar las mismas versiones del servidor de la base de datos. Existen otras diferencias entre las bases de datos (como el comportamiento de GROUP BY) de las que ActiveRecord no lo aislará. Es posible que ya estés haciendo esto, pero pensé en mencionarlo de todos modos.

Actualizar :Las versiones más nuevas de ActiveRecord sí entienden varchar sin límite, por lo que, al menos con PostgreSQL, puede decir:

change_column :your_table, :your_column, :string, limit: nil

para cambiar un varchar(n) columna a varchar . text y varchar siguen siendo lo mismo en lo que respecta a PostgreSQL, pero algunos creadores de formularios los tratarán de manera diferente:varchar obtiene un <input type="text"> mientras que text obtiene un <textarea> de varias líneas .