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>
.