Вам следует использовать 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>
.
change
что нельзя автоматически отменить изменение типа, и в Руководстве по миграции действительно сказано, что «[метод изменения] Этот метод предпочтительнее для написания конструктивных миграций (добавление столбцов или таблиц)» иchange_column
не t в списке, на который вы указываете, так что я думаю, что вы правы. Я исправил его для использованияup
/down
(с оговоркойdown
), спасибо за внимание.text
только для получения неограниченной длины; вы можете просто использовать без ограниченийvarchar
. Это странное ограничение накладывает Rails, а не PostgreSQL.Хотя принятый ответ превосходен, я хотел добавить сюда ответ, который, надеюсь, лучше касается исходной части 2 вопроса плаката для неспециалистов, таких как я.
создание миграции каркаса
Вы можете сгенерировать миграцию, чтобы сохранить изменения, набрав в консоли (просто замените имя
table
своей таблицы и имяcolumn
столбца)rails generate migration change_table_column
Это приведет к миграции скелета внутри вашего приложения Rails / db / migrate / folder. Эта миграция является заполнителем вашего кода миграции.
Например, я хочу создать миграцию для изменения типа столбца с
string
наtext
в таблице TodoItems:class ChangeTodoItemsDescription < ActiveRecord::Migration def change # enter code here change_column :todo_items, :description, :text end end
Запуск миграции
После того, как вы ввели код для изменения столбца, просто запустите:
rake db:migrate
Чтобы применить вашу миграцию. Если вы допустили ошибку, вы всегда можете отменить изменение с помощью:
rake db:rollack
Методы вверх и вниз
Принятые ссылки на ответы
Up
иDown
методы вместо более новогоChange
метода. Начиная с версии rails 3.2, методы Up и Down в старом стиле имели несколько преимуществ по сравнению с новым методом Change. Избегайте «вверх и вниз»ActiveRecord::IrreversibleMigration exception
. Начиная с выпуска Rails 4 вы можете использовать,reversible
чтобы избежать этой ошибки:class ChangeProductsPrice < ActiveRecord::Migration def change reversible do |dir| change_table :products do |t| dir.up { t.change :price, :string } dir.down { t.change :price, :integer } end end end end
Наслаждайтесь Rails :)
источник