Powinieneś używać textz 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 => falselub inne opcje na końcu tego.
Kiedy używasz stringkolumny 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 varcharkolumny bez długości, ale większość baz danych używa do tego osobnego typu, a Railsy nie wiedzą o varcharbez długości. Musisz użyć textw Railsach, aby uzyskać textkolumnę w PostgreSQL. W PostgreSQL nie ma różnicy między kolumną typu texta 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 textivarchar(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 stringkolumny w dowolnym miejscu, powinieneś zawsze określić :limitjako 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ą varcharbez ograniczeń, więc przynajmniej z PostgreSQL możesz powiedzieć:
change_column :your_table, :your_column, :string, limit: nil
zmienić varchar(n)kolumnę na varchar. texti varcharnadal są tym samym, jeśli chodzi o PostgreSQL, ale niektóre konstruktory formularzy będą traktować je inaczej: varchardostaje an, <input type="text">a textotrzymuje wiele linii <textarea>.