Du skal bruge text
med Rails, hvis du ønsker en streng uden længdebegrænsning. En migration som denne:
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
skal ordne tingene. Du vil måske have :null => false
eller nogle andre muligheder i slutningen af det også.
Når du bruger en string
kolonne uden en eksplicit grænse, vil Rails tilføje en implicit :limit => 255
. Men hvis du bruger text
, får du den strengtype af vilkårlig længde, som databasen understøtter. PostgreSQL giver dig mulighed for at bruge en varchar
kolonne uden en længde, men de fleste databaser bruger en separat type til det, og Rails kender ikke til varchar
uden længde. Du skal bruge text
i Rails for at få en text
kolonne i PostgreSQL. Der er ingen forskel i PostgreSQL mellem en kolonne af typen text
og en af typen varchar
(men varchar(n)
er forskellige). Desuden, hvis du implementerer oven på PostgreSQL, er der ingen grund til at bruge :string
(AKA varchar
) i det hele taget behandler databasen text
og varchar(n)
det samme internt bortset fra de ekstra længdebegrænsninger for varchar(n)
; du bør kun bruge varchar(n)
(AKA :string
) hvis du har en ekstern begrænsning (såsom en regeringsformular, der siger, at felt 432 på formular 897/B vil være 23 tegn langt) på kolonnestørrelsen.
Som en sidebemærkning, hvis du bruger en string
kolonne hvor som helst, bør du altid angive :limit
som en påmindelse til dig selv om, at der er en grænse, og du bør have en validering i modellen for at sikre, at grænsen ikke overskrides. Hvis du overskrider grænsen, vil PostgreSQL klage og rejse en undtagelse, MySQL vil stille og roligt afkorte strengen eller klage (afhængigt af serverkonfigurationen), SQLite vil lade det passere som det er, og andre databaser vil gøre noget andet (sandsynligvis klage) .
Du bør også udvikle, teste og implementere oven på den samme database (som normalt vil være PostgreSQL hos Heroku), du bør endda bruge de samme versioner af databaseserveren. Der er andre forskelle mellem databaser (såsom opførsel af GROUP BY), som ActiveRecord ikke vil isolere dig fra. Du gør måske allerede dette, men jeg tænkte, at jeg ville nævne det alligevel.
Opdater :Nyere versioner af ActiveRecord forstår varchar
uden en grænse, så med PostgreSQL i det mindste kan du sige:
change_column :your_table, :your_column, :string, limit: nil
for at ændre en varchar(n)
kolonne til varchar
. text
og varchar
er stadig det samme, hvad PostgreSQL angår, men nogle formbyggere vil behandle dem anderledes:varchar
får en <input type="text">
hvorimod text
får en multi-line <textarea>
.