Rozważ poniższy skrypt tworzenia tabeli:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
Czy można ustawić domyślną wartość jako aktualny czas?
Próbuję znaleźć niezależny odpowiednik DB w szynach dla definicji kolumn SQL podanych poniżej:
Składnia Oracle
start_at DATE DEFAULT SYSDATE()
Składnia MySQL
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
LUB
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Harish Shetty
źródło
źródło
CURRENT_TIMESTAMP
będzie to czas rozpoczęcia bieżącej transakcji, więc wiele rekordów utworzonych w tej samej transakcji otrzyma tę samą wartość. Jeśli chcesz mieć aktualny czas wykonania instrukcji (ignorując kontekst transakcji), sprawdźCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
i tak wygląda w schema.rbt.datetime "start_date", default: -> { "now()" }
Ale kiedy utworzyłem nowy rekord, nie jest on zapełniany. Każdy pomysł, dlaczego?post.reload
aby uzyskać te wartości. Wyjaśniono to tutaj: stackoverflow.com/questions/53804787/…Możesz dodać funkcję w modelu takim jak ten:
Aby model ustawił aktualny czas w modelu.
Możesz również umieścić w migracji kod sql, aby ustawić wartość domyślną na poziomie bazy danych, na przykład:
Ustawienie czegoś takiego:
powoduje wykonanie funkcji Time.now podczas migracji, więc tabela w bazie danych jest tworzona w następujący sposób:
ale myślę, że nie tego chcesz.
źródło
new()
. With ). Więcself.foo = Time.now
zastąpi wartość, której możesz nadaćnew()
. Proponujęself.foo = Time.current unless self.foo.present?
zamiast tego.:starts_at, :default => 'now()'
w schema.rb. Jednak to nie zadziała, gdy użyjesz,rake db:schema:dump
który zastąpi schema.rb:starts_at, :default => '2015-05-29 09:46:33'
(lub inną datą uruchomienia skryptu) ... smutno ...Nie musisz robić nic więcej poza posiadaniem tej kolumny.
źródło
Zwyklę robię:
Więc twój
schema.rb
będzie miał coś takiego:źródło
rake db:migrate
, a nie po załadowaniu pliku schematu z czymś w rodzajurake db:schema:load
.Szukałem podobnych rozwiązań, ale skończyłem na https://github.com/FooBarWidget/default_value_for .
default_value_for
Wtyczka pozwala zdefiniować domyślne wartości dla modeli ActiveRecord w sposób deklaratywny. Na przykład:źródło
Jeśli trzeba zmienić to istniejące kolumny DateTime w Rails 5 (zamiast tworzenia nowej tabeli, jak określono w innych odpowiedzi) tak, że może skorzystać z możliwości domyślna data, można utworzyć migrację takiego:
źródło
W odpowiedzi udzielonej przez @ szymon-lipiński (Szymon Lipiński) metoda execute nie zadziałała. Zgłaszał błąd składni MySQL.
Oto składnia MySQL, która działała dla mnie.
Tak więc ustawienie domyślnej wartości kolumny z datą i godziną w skrypcie migracji można wykonać w następujący sposób:
źródło