Měli byste použít text
s Rails, pokud chcete řetězec bez omezení délky. Migrace jako je tato:
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
by měl věci vyřešit. Možná budete chtít :null => false
nebo některé další možnosti na konci.
Když použijete string
sloupec bez explicitního limitu, Rails přidá implicitní :limit => 255
. Ale pokud použijete text
, získáte libovolný typ řetězce libovolné délky, který databáze podporuje. PostgreSQL vám umožňuje použít varchar
sloupec bez délky, ale většina databází pro to používá samostatný typ a Rails nezná varchar
bez délky. Musíte použít text
v Rails, abyste získali text
sloupec v PostgreSQL. V PostgreSQL není žádný rozdíl mezi sloupcem typu text
a jeden typu varchar
(ale varchar(n)
je odlišný). Navíc, pokud nasazujete nad PostgreSQL, není důvod používat :string
(AKA varchar
) vůbec, databáze zpracovává text
a varchar(n)
totéž interně kromě omezení délky navíc pro varchar(n)
; měli byste používat pouze varchar(n)
(AKA :string
) pokud máte externí omezení (např. vládní formulář, který říká, že pole 432 na formuláři 897/B bude mít 23 znaků) na velikost sloupce.
Kromě toho, pokud používáte string
kdekoli, měli byste vždy zadat :limit
jako připomenutí, že existuje limit a měli byste mít v modelu ověření, abyste zajistili, že limit nebude překročen. Pokud limit překročíte, PostgreSQL si bude stěžovat a vyvolá výjimku, MySQL tiše zkrátí řetězec nebo si stěžuje (v závislosti na konfiguraci serveru), SQLite to nechá projít tak, jak je, a ostatní databáze udělají něco jiného (pravděpodobně si budou stěžovat) .
Také byste měli vyvíjet, testovat a nasazovat na stejnou databázi (což bude obvykle PostgreSQL v Heroku), dokonce byste měli používat stejné verze databázového serveru. Existují další rozdíly mezi databázemi (jako je chování GROUP BY), od kterých vás ActiveRecord neizoluje. Možná to už děláte, ale přesto jsem si myslel, že to zmíním.
Aktualizovat :Novější verze ActiveRecord rozumí varchar
bez omezení, takže alespoň s PostgreSQL můžete říci:
change_column :your_table, :your_column, :string, limit: nil
pro změnu varchar(n)
sloupec na varchar
. text
a varchar
jsou stále stejné, pokud jde o PostgreSQL, ale někteří tvůrci formulářů s nimi budou zacházet jinak:varchar
získá <input type="text">
zatímco text
získá víceřádkový <textarea>
.