Трябва да използвате 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> .