Powinieneś użyć text
z Railsami, jeśli chcesz mieć napis bez limitu długości. Taka migracja:
def up
change_column :your_table, :your_column, :text
end
def down
# This might cause trouble if you have strings longer
# than 255 characters.
change_column :your_table, :your_column, :string
end
powinien uporządkować sprawy. Możesz chcieć :null => false
lub inne opcje na końcu.
Kiedy używasz string
kolumna bez wyraźnego limitu, Railsy dodadzą niejawny :limit => 255
. Ale jeśli używasz text
, otrzymasz dowolny typ łańcucha o dowolnej długości, który obsługuje baza danych. PostgreSQL pozwala na użycie varchar
kolumna 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
kolumna w PostgreSQL. W PostgreSQL nie ma różnicy między kolumną typu text
i jeden typu varchar
(ale varchar(n)
jest różne). Co więcej, jeśli wdrażasz na PostgreSQL, nie ma powodu, aby używać :string
(AKA varchar
) w ogóle baza danych traktuje text
i varchar(n)
to samo wewnętrznie, z wyjątkiem dodatkowych ograniczeń długości dla varchar(n)
; powinieneś używać tylko varchar(n)
(AKA :string
), jeśli masz ograniczenie zewnętrzne (takie jak formularz rządowy, który mówi, że pole 432 w formularzu 897/B będzie miało długość 23 znaków) na rozmiar kolumny.
Na marginesie, jeśli używasz string
kolumna w dowolnym miejscu, należy zawsze określić :limit
jako przypomnienie dla siebie, że istnieje limit i powinieneś mieć walidację w modelu, aby upewnić się, że limit nie zostanie przekroczony. Jeśli przekroczysz limit, PostgreSQL narzeka i zgłosi wyjątek, MySQL po cichu skróci ciąg lub narzeka (w zależności od konfiguracji serwera), SQLite pozwoli mu przejść bez zmian, a inne bazy danych zrobią coś innego (prawdopodobnie narzeka) .
Powinieneś także rozwijać, testować i wdrażać na tej samej bazie danych (którą zwykle będzie 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), od których ActiveRecord nie będzie Cię izolować. Być może już to robisz, ale pomyślałem, że i tak o tym wspomnę.
Aktualizacja :Nowsze wersje ActiveRecord rozumieją varchar
bez limitu, więc przynajmniej w PostgreSQL możesz powiedzieć:
change_column :your_table, :your_column, :string, limit: nil
zmienić varchar(n)
kolumna do varchar
. text
i varchar
są nadal tym samym, jeśli chodzi o PostgreSQL, ale niektóre kreatory formularzy traktują je inaczej:varchar
otrzymuje <input type="text">
podczas gdy text
pobiera wielowierszowy <textarea>
.