Powinieneś używać text
z Railsami, jeśli potrzebujesz łańcucha bez limitu długości. Taka migracja:
def up
change_column :your_table, :your_column, :text
end
def down
change_column :your_table, :your_column, :string
end
powinien załatwić sprawę. Możesz chcieć :null => false
lub inne opcje na końcu tego.
Kiedy używasz string
kolumny bez jawnego ograniczenia, Railsy dodają niejawne :limit => 255
. Ale jeśli używasz text
, otrzymasz dowolny ciąg o dowolnej długości obsługiwany przez bazę danych. PostgreSQL pozwala na użycie varchar
kolumny bez długości, ale większość baz danych używa do tego osobnego typu, a Railsy nie wiedzą o varchar
bez długości. Musisz użyć text
w Railsach, aby uzyskać text
kolumnę w PostgreSQL. W PostgreSQL nie ma różnicy między kolumną typu text
a kolumną typu varchar
(ale varchar(n)
jest inna). Ponadto, jeśli wdrażasz na bazie PostgreSQL, nie ma żadnego powodu, aby używać :string
(AKA varchar
), baza danych traktuje text
ivarchar(n)
to samo wewnętrznie, z wyjątkiem dodatkowych ograniczeń długości dla varchar(n)
; Powinieneś używać varchar(n)
(AKA :string
) tylko wtedy, gdy masz zewnętrzne ograniczenie (takie jak rządowy formularz, który mówi, że pole 432 w formularzu 897 / B będzie miało 23 znaki) dotyczące rozmiaru kolumny.
Nawiasem mówiąc, jeśli używasz string
kolumny w dowolnym miejscu, powinieneś zawsze określić :limit
jako przypomnienie sobie, że istnieje limit i powinieneś mieć walidację w modelu, aby upewnić się, że limit nie zostanie przekroczony. Jeśli przekroczysz limit, PostgreSQL zgłosi skargę i zgłosi wyjątek, MySQL po cichu skróci ciąg znaków lub narzeka (w zależności od konfiguracji serwera), SQLite pozwoli na to, jak jest, a inne bazy danych zrobią coś innego (prawdopodobnie narzekają) .
Powinieneś także programować, testować i wdrażać na tej samej bazie danych (zazwyczaj będzie to PostgreSQL w Heroku), powinieneś nawet używać tych samych wersji serwera bazy danych. Istnieją inne różnice między bazami danych (takie jak zachowanie GROUP BY), przed którymi ActiveRecord nie będzie Cię izolować. Może już to robisz, ale pomyślałem, że i tak o tym wspomnę.
Aktualizacja : nowsze wersje ActiveRecord rozumieją varchar
bez ograniczeń, więc przynajmniej z PostgreSQL możesz powiedzieć:
change_column :your_table, :your_column, :string, limit: nil
zmienić varchar(n)
kolumnę na varchar
. text
i varchar
nadal są tym samym, jeśli chodzi o PostgreSQL, ale niektóre konstruktory formularzy będą traktować je inaczej: varchar
dostaje an, <input type="text">
a text
otrzymuje wiele linii <textarea>
.
change
że nie byłoby w stanie automatycznie cofnąć zmiany typu, a Przewodnik po migracji mówi, że „[metoda zmiany] Ta metoda jest preferowana do pisania konstruktywnych migracji (dodawania kolumn lub tabel)” ichange_column
nie jest t na liście, na którą wskazujesz, więc myślę, że masz rację. Naprawiłem to tak, aby używaćup
/down
(z zastrzeżeniem nadown
), dzięki za ostrzeżenie .text
tylko do uzyskania nieograniczonej długości; możesz po prostu użyć nieograniczonegovarchar
. Railsy narzucają ten dziwny limit, a nie PostgreSQL.Chociaż przyjęta odpowiedź jest doskonała, chciałem dodać tutaj odpowiedź, która, mam nadzieję, lepiej radzi sobie z oryginalnym pytaniem dotyczącym plakatów część 2, dla nie-ekspertów, takich jak ja.
generowanie migracji rusztowań
Możesz wygenerować migrację, aby zatrzymać zmiany, wpisując w konsoli (po prostu zamień
table
na nazwę swojej tabeli icolumn
nazwę kolumny)rails generate migration change_table_column
Spowoduje to wygenerowanie migracji szkieletu w aplikacji Rails / db / migrate / folder. Ta migracja jest symbolem zastępczym dla kodu migracji.
Na przykład chcę utworzyć migrację, aby zmienić typ kolumny z
string
natext
, w tabeli o nazwie TodoItems:class ChangeTodoItemsDescription < ActiveRecord::Migration def change # enter code here change_column :todo_items, :description, :text end end
Prowadzenie migracji
Po wprowadzeniu kodu, aby zmienić kolumnę, po prostu uruchom:
rake db:migrate
Aby zastosować migrację. Jeśli popełnisz błąd, zawsze możesz cofnąć zmianę za pomocą:
rake db:rollack
Metody w górę iw dół
Zaakceptowane odniesienia
Up
iDown
metody odpowiedzi zamiast nowszejChange
metody. Od czasów railsów 3.2 metody Up i Down w starym stylu miały kilka zalet w porównaniu z nowszą metodą Change. Unikaj „w górę iw dół”ActiveRecord::IrreversibleMigration exception
. Od wydania Rails 4 możesz użyć,reversible
aby uniknąć tego błędu: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
Ciesz się Railsami :)
źródło