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