Трябва да използвате text
с Rails, ако искате низ без ограничение за дължина. Миграция като тази:
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
трябва да подреди нещата. Може да искате :null => false
или някои други опции в края на това.
Когато използвате string
колона без изрично ограничение, Rails ще добави неявно :limit => 255
. Но ако използвате text
, ще получите произволен тип низ с произволна дължина, който базата данни поддържа. PostgreSQL ви позволява да използвате varchar
колона без дължина, но повечето бази данни използват отделен тип за това и Rails не знае за varchar
без дължина. Трябва да използвате text
в Rails, за да получите text
колона в PostgreSQL. В PostgreSQL няма разлика между колона от тип text
и един от тип varchar
(но varchar(n)
е различен). Освен това, ако внедрявате върху PostgreSQL, няма причина да използвате :string
(известен още като varchar
) изобщо, базата данни третира text
и varchar(n)
същото вътрешно, с изключение на допълнителните ограничения за дължина за varchar(n)
; трябва да използвате само varchar(n)
(известен още като :string
), ако имате външно ограничение (като правителствен формуляр, който казва, че поле 432 във формуляр 897/B ще бъде дълго 23 знака) за размера на колоната.
Като настрана, ако използвате string
колона навсякъде, винаги трябва да задавате :limit
като напомняне за себе си, че има ограничение и трябва да имате валидиране в модела, за да сте сигурни, че ограничението не е надвишено. Ако превишите лимита, PostgreSQL ще се оплаче и ще предизвика изключение, MySQL тихо ще съкрати низа или ще се оплаче (в зависимост от конфигурацията на сървъра), SQLite ще го остави да премине както е, а други бази данни ще направят нещо друго (вероятно се оплакват) .
Освен това трябва да разработвате, тествате и внедрявате върху една и съща база данни (която обикновено ще бъде PostgreSQL в Heroku), дори трябва да използвате същите версии на сървъра на базата данни. Има и други разлики между базите данни (като поведението на GROUP BY), от които ActiveRecord няма да ви изолира. Може вече да правите това, но все пак реших да го спомена.
Актуализиране :По-новите версии на ActiveRecord разбират varchar
без ограничение, така че поне с PostgreSQL можете да кажете:
change_column :your_table, :your_column, :string, limit: nil
за да промените varchar(n)
колона към varchar
. text
и varchar
са все още едно и също нещо, що се отнася до PostgreSQL, но някои създатели на формуляри ще ги третират по различен начин:varchar
получава <input type="text">
докато text
получава многоредов <textarea>
.