Ответ 1
Вы должны использовать 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 не будет изолировать вас. Возможно, вы это уже делаете, но я думал, что все равно напишу об этом.