Вы должны использовать 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
(AKA varchar
) вообще, база данных обрабатывает text
и varchar(n)
внутренне одинаково, за исключением ограничений дополнительной длины для varchar(n)
;Вы должны использовать varchar(n)
(AKA :string
) только в том случае, если у вас есть внешнее ограничение (например, правительственная форма, в которой указано, что поле 432 в форме 897 / B будет иметь длину 23 символа) для размера столбца.
Кроме того, если вы где-либо используете столбец string
, вы всегда должны указывать :limit
в качестве напоминания себе о том, что существует предел, и вы должны иметь проверку в модели, чтобы убедиться, что пределне превышенЕсли вы превысите лимит, PostgreSQL будет жаловаться и выдавать исключение, MySQL будет тихо урезать строку или жаловаться (в зависимости от конфигурации сервера), SQLite позволит ей пройти как есть, а другие базы данных сделают что-то другое (возможно, будут жаловаться).
Кроме того, вы должны также разрабатывать, тестировать и развертывать поверх одной и той же базы данных (обычно это PostgreSQL в Heroku), вам даже следует использовать те же версии сервера базы данных.Существуют и другие различия между базами данных (например, поведение GROUP BY), от которых ActiveRecord вас не изолирует.Возможно, вы уже делаете это, но я все равно упомянул об этом.