Migracje Railsów: Cofnij domyślne ustawienie dla kolumny

190

Mam problem, że mam migrację w Railsach, która konfiguruje domyślne ustawienie dla kolumny, jak w tym przykładzie:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

Załóżmy, że lubię porzucić te ustawienia domyślne w późniejszej migracji. Jak to zrobić za pomocą migracji szyn?

Moje obecne obejście polega na wykonaniu niestandardowej komendy sql podczas migracji szyn:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

Ale nie podoba mi się to podejście, ponieważ jestem teraz zależny od tego, w jaki sposób baza danych interpretuje to polecenie. W przypadku zmiany bazy danych to zapytanie może nie działać i migracja zostałaby przerwana. Czy jest więc sposób wyrażenia cofnięcia domyślnego ustawienia kolumny w szynach?

Wulfovitch
źródło

Odpowiedzi:

387

Szyny 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

Szyny 3 i Szyny 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end
Jeremy Mack
źródło
7
W Postgresie tak naprawdę nie upuszcza domyślnej wartości dla CHARACTER VARYINGkolumn, wystarczy ustawić ją na NULL::character varying.
Attila O.
8
W nowszych wersjach możesz to zmienić. Na przykład: change_column_default(:table_name, :column_name, from: nil, to: false)
Mark
1
@AttilaO. Odniosłem sukces ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT, myślę, że nie muszę go ustawiać NULL.
Eli Rose - REINSTATE MONICA
Do Twojej wiadomości, wygląda na to, że wersja odwracalna, o której wspomina @Mark, została dodana w Railsach 5+, więc niczego poniżej tego nie będziesz mógł użyć.
Joshua Pinter,
23

Wygląda na to, że postępujesz właściwie ze swoim „wykonywaniem”, jak wskazują dokumenty:

change_column_default(table_name, column_name, default)

Ustawia nową wartość domyślną dla kolumny. Jeśli chcesz ustawić wartość domyślną na NULL, nie masz szczęścia. Musisz DatabaseStatements # samodzielnie wykonać odpowiednią instrukcję SQL. Przykłady

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)
Serx
źródło
Dzięki! Sam nie znalazłem tej wskazówki w dokumentacji! Hopefull wbudowują upuszczając wartości domyślne do migracji w przyszłych wersjach szyn.
wulfovitch
1
Nie jest to już prawdą od wersji Rails 3.1.0, por. apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/…
asymetryczny
14

Poniższego fragmentu używam do tworzenia NULLkolumn NOT NULL, ale pomijam DEFAULTna poziomie schematu:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end
Alex Fortuna
źródło
Nie widzę wartości dodanej w tej odpowiedzi, ponieważ zaakceptowana stwierdza to samo.
Mosselman,
-3

Szyny 4

change_column :courses, :name, :string, limit: 100, null: false
Lesly Revenge
źródło
10
Ten dodaje ograniczenie NOT NULL, nie ma nic wspólnego z DOMYŚLNYM
Extrapolator
nie ma nic wspólnego z DOMYŚLNYM +1
Ivan Wang