Вам следует использовать textс Rails, если вам нужна строка без ограничения длины. Такая миграция:
def up
change_column :your_table, :your_column, :text
end
def down
change_column :your_table, :your_column, :string
end
следует во всем разобраться. Возможно, вы захотите :null => falseили другие варианты в конце.
Когда вы используете stringстолбец без явного ограничения, Rails добавит неявный :limit => 255. Но если вы используете text, вы получите любой тип строки произвольной длины, который поддерживает база данных. PostgreSQL позволяет использовать varcharстолбец без длины, но в большинстве баз данных для этого используется отдельный тип, а Rails не знает об этом varcharбез длины. Вам нужно использовать textRails, чтобы получить 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 вас не изолирует. Возможно, вы уже делаете это, но я все равно подумал об этом.
Обновление : новые версии ActiveRecord понимают varcharбез ограничений, поэтому, по крайней мере, с PostgreSQL вы можете сказать:
change_column :your_table, :your_column, :string, limit: nil
изменить varchar(n)столбец на varchar. textи varcharостаются тем же самым в отношении PostgreSQL, но некоторые конструкторы форм будут относиться к ним по-другому: varcharполучает, <input type="text">тогда как textполучает многострочность <textarea>.