Debe 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 usa una string
columna sin un límite explícito, Rails agregará un implícito :limit => 255
. Pero si lo usa text
, obtendrá cualquier tipo de cadena de longitud arbitraria que admita la base de datos. PostgreSQL le permite usar una 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 una longitud. Tienes que usar text
Rails para obtener una text
columna en PostgreSQL. No hay diferencia en PostgreSQL entre una columna de tipo text
y una de tipo varchar
(pero varchar(n)
es diferente). Además, si está implementando sobre PostgreSQL, no hay ninguna razón para usar :string
(AKA varchar
) en absoluto, la base de datos trata text
yvarchar(n)
lo mismo internamente excepto por las restricciones de longitud extra para varchar(n)
; solo debe usar varchar(n)
(AKA :string
) si tiene una restricción externa (como un formulario gubernamental que dice que el campo 432 en el formulario 897 / B tendrá 23 caracteres) en el tamaño de la columna.
Como acotación al margen, si está utilizando una string
columna en cualquier lugar, siempre debe especificar :limit
como recordatorio para sí mismo que hay un límite y debe tener una validación en el modelo para asegurarse de 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á (dependiendo de la configuración del servidor), SQLite lo dejará pasar como está y otras bases de datos harán otra cosa (probablemente se quejen) .
Además, también debería estar desarrollando, probando e implementando sobre la misma base de datos (que normalmente será PostgreSQL en Heroku), incluso debería utilizar las mismas versiones del servidor de base de datos. Hay otras diferencias entre las bases de datos (como el comportamiento de GROUP BY) de las que ActiveRecord no lo aislará. Puede que ya estés haciendo esto, pero pensé en mencionarlo de todos modos.
change
no pueda revertir automáticamente un cambio de tipo y la Guía de migraciones dice que "[el método de cambio] Este método es el preferido para escribir migraciones constructivas (agregar columnas o tablas)" ychange_column
no t en la lista que señala, así que creo que tiene razón. Lo arreglé para usarup
/down
(con una advertencia en eldown
), gracias por el aviso.text
solo para obtener una longitud ilimitada; puede usar sin restriccionesvarchar
. Rails está imponiendo este extraño límite, no PostgreSQL.Si bien la respuesta aceptada es excelente, quería agregar una respuesta aquí que, con suerte, se ocupa mejor de la parte 2 de la pregunta sobre los carteles originales, para los no expertos como yo.
generando migración de andamios
Puede generar una migración para mantener su cambio escribiendo en su consola (solo reemplace el
table
por el nombre de su tabla ycolumn
por el nombre de su columna)Esto generará una migración de esqueleto dentro de su aplicación Rails / db / migrate / carpeta. Esta migración es un marcador de posición para su código de migración.
Por ejemplo, quiero crear una migración para cambiar el tipo de columna de
string
atext
, en una tabla llamada TodoItems:Ejecutando su migración
Una vez que haya ingresado el código para cambiar la columna, simplemente ejecute:
Para aplicar su migración. Si comete un error, siempre puede revertir el cambio con:
Métodos arriba y abajo
Las referencias
Up
yDown
métodos de respuesta aceptados , en lugar delChange
método más nuevo . Dado que los métodos de subida y bajada de estilo antiguo de rieles 3.2 presentaban algunas ventajas sobre el método de cambio más nuevo. Evitar 'Arriba y Abajo' . Desde el lanzamiento de Rails 4 , puede utilizar para evitar este error:ActiveRecord::IrreversibleMigration exception
reversible
Disfruta de Rails :)
fuente