Dovresti usare text
con Rails se vuoi una stringa senza limiti di lunghezza. Una migrazione come questa:
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
dovrebbe sistemare le cose. Potresti volere :null => false
o anche altre opzioni alla fine.
Quando usi una string
colonna senza un limite esplicito, Rails aggiungerà un implicito :limit => 255
. Ma se usi text
, otterrai qualsiasi tipo di stringa di lunghezza arbitraria supportato dal database. PostgreSQL ti permette di usare un varchar
colonna senza una lunghezza, ma la maggior parte dei database usa un tipo separato per questo e Rails non sa di varchar
senza una lunghezza. Devi usare text
in Rails per ottenere un text
colonna in PostgreSQL. Non c'è differenza in PostgreSQL tra una colonna di tipo text
e uno di tipo varchar
(ma varchar(n)
è diverso). Inoltre, se stai implementando su PostgreSQL, non c'è motivo di usare :string
(AKA varchar
) il database tratta il text
e varchar(n)
lo stesso internamente ad eccezione dei vincoli di lunghezza extra per varchar(n)
; dovresti usare solo varchar(n)
(AKA :string
) se hai un vincolo esterno (come un modulo governativo che dice che il campo 432 sul modulo 897/B sarà lungo 23 caratteri) sulla dimensione della colonna.
Per inciso, se stai usando una string
colonna ovunque, dovresti sempre specificare il :limit
come promemoria per te stesso che esiste un limite e dovresti avere una convalida nel modello per assicurarti che il limite non venga superato. Se superi il limite, PostgreSQL si lamenterà e solleverà un'eccezione, MySQL troncherà silenziosamente la stringa o si lamenterà (a seconda della configurazione del server), SQLite la farà passare così com'è e altri database faranno qualcos'altro (probabilmente si lamenteranno) .
Inoltre, dovresti anche sviluppare, testare e distribuire sullo stesso database (che di solito sarà PostgreSQL su Heroku), dovresti anche usare le stesse versioni del server di database. Esistono altre differenze tra i database (come il comportamento di GROUP BY) da cui ActiveRecord non ti isola. Potresti già farlo, ma ho pensato di menzionarlo comunque.
Aggiorna :Le versioni più recenti di ActiveRecord comprendono varchar
senza limiti quindi, almeno con PostgreSQL, puoi dire:
change_column :your_table, :your_column, :string, limit: nil
per modificare un varchar(n)
colonna a varchar
. text
e varchar
sono sempre la stessa cosa per quanto riguarda PostgreSQL, ma alcuni costruttori di moduli li tratteranno in modo diverso:varchar
ottiene un <input type="text">
mentre text
ottiene un <textarea>
a più righe .