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 .