Pertimbangkan skrip pembuatan tabel di bawah ini:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
Apakah mungkin untuk menyetel nilai default sebagai waktu saat ini?
Saya mencoba menemukan padanan independen DB di rel untuk definisi kolom SQL yang diberikan di bawah ini:
Sintaks Oracle
start_at DATE DEFAULT SYSDATE()
Sintaks MySQL
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ATAU
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Harish Shetty
sumber
sumber
CURRENT_TIMESTAMP
akan menjadi waktu dimulainya transaksi saat ini, jadi beberapa catatan yang dibuat dalam transaksi yang sama akan mendapatkan nilai yang sama. Jika Anda ingin waktu aktual eksekusi pernyataan (mengabaikan konteks transaksi), periksaCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
dan seperti inilah tampilannya di schema.rbt.datetime "start_date", default: -> { "now()" }
Tapi ketika saya membuat catatan baru, catatan itu tidak diisi. Tahu kenapa?post.reload
untuk mendapatkan nilai-nilai itu. Ini dijelaskan di sini: stackoverflow.com/questions/53804787/…Anda dapat menambahkan fungsi dalam model seperti ini:
Sehingga model akan mengatur waktu saat ini dalam model.
Anda juga dapat menempatkan beberapa kode sql dalam migrasi untuk menyetel nilai default pada tingkat database, seperti:
Menyetel sesuatu seperti ini:
menyebabkan eksekusi fungsi Time.now selama migrasi sehingga tabel dalam database dibuat seperti ini:
tapi saya pikir itu bukan yang Anda inginkan.
sumber
new()
). Jadiself.foo = Time.now
akan menimpa nilai yang mungkin Anda berikannew()
. Saya menyarankanself.foo = Time.current unless self.foo.present?
sebagai gantinya.:starts_at, :default => 'now()'
di schema.rb. Namun ini tidak akan berfungsi ketika menggunakanrake db:schema:dump
yang akan menimpa schema.rb dengan:starts_at, :default => '2015-05-29 09:46:33'
(atau apa pun tanggal saat Anda meluncurkan skrip) ... sedih ....Anda tidak perlu melakukan apa pun kecuali memiliki kolom itu.
sumber
Saya sedang mencari solusi serupa tetapi saya akhirnya menggunakan https://github.com/FooBarWidget/default_value_for .
The
default_value_for
Plugin memungkinkan seseorang untuk menentukan nilai default untuk model ActiveRecord secara deklaratif. Sebagai contoh:sumber
Saya biasanya melakukan:
Jadi, Anda
schema.rb
akan memiliki sesuatu seperti:sumber
rake db:migrate
, bukan saat Anda memuat file skema dengan sesuatu sepertirake db:schema:load
.Jika Anda perlu mengubah sebuah DateTime kolom yang ada di Rails 5 (bukan menciptakan tabel baru sebagaimana ditentukan dalam jawaban lain) sehingga dapat mengambil keuntungan dari kemampuan tanggal default, Anda dapat membuat migrasi seperti ini:
sumber
Dalam jawaban yang diberikan oleh @ szymon-lipiński (Szymon Lipiński), metode eksekusi tidak berhasil untuk saya. Itu membuat kesalahan sintaks MySQL.
Sintaks MySQL yang berhasil untuk saya adalah ini.
Jadi untuk mengatur nilai default kolom datetime pada script migrasi dapat dilakukan sebagai berikut:
sumber