마이그레이션에서 생성 시간을 기록하기 위해 datetime 열의 기본값을 설정하는 방법은 무엇입니까?
아래 테이블 생성 스크립트를 고려하십시오.
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
기본값을 현재 시간으로 설정할 수 있습니까?
아래에 주어진 SQL 열 정의에 대한 레일에서 DB 독립적 인 등가물을 찾으려고합니다.
Oracle 구문
start_at DATE DEFAULT SYSDATE()
MySQL 구문
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
또는
start_at DATETIME DEFAULT NOW()
이것은 이제 Rails 5에서 지원됩니다.
다음은 샘플 마이그레이션입니다.
class CreatePosts < ActiveRecord::Migration[5.0]
def change
create_table :posts do |t|
t.datetime :modified_at, default: -> { 'CURRENT_TIMESTAMP' }
t.timestamps
end
end
end
https://github.com/rails/rails/issues/27077 에서 토론을 참조 하고 prathamesh-sonpatki의 답변
다음과 같이 모델에 함수를 추가 할 수 있습니다.
before_create :set_foo_to_now
def set_foo_to_now
self.foo = Time.now
end
모델이 모델의 현재 시간을 설정하도록합니다.
또한 다음과 같이 데이터베이스 수준에서 기본값을 설정하기 위해 마이그레이션에 몇 가지 SQL 코드를 배치 할 수 있습니다.
execute 'alter table foo alter column starts_at set default now()'
다음과 같이 설정 :
create_table :foo do |t|
t.datetime :starts_at, :null => false, :default => Time.now
end
마이그레이션 중에 Time.now 함수를 실행하므로 데이터베이스의 테이블이 다음과 같이 생성됩니다.
create table foo ( starts_at timestamp not null default '2009-01-01 00:00:00');
그러나 나는 그것이 당신이 원하는 것이 아니라고 생각합니다.
Active Record는 테이블에
created_at
/created_on
또는updated_at
/ 라는 필드가있는 경우 작업을 자동으로 생성 및 업데이트합니다updated_on
. 출처-api.rubyonrails.org
해당 열을 갖는 것 외에는 다른 작업을 수행 할 필요가 없습니다.
비슷한 솔루션을 찾고 있었지만 https://github.com/FooBarWidget/default_value_for 사용하여 끝났습니다 .
default_value_for
플러그인은 하나가 선언적 방식으로 액티브 모델에 대한 기본 값을 정의 할 수 있습니다. 예를 들면 :
class User < ActiveRecord::Base
default_value_for :name, "(no name)"
default_value_for :last_seen do
Time.now
end
end
u = User.new
u.name # => "(no name)"
u.last_seen # => Mon Sep 22 17:28:38 +0200 2008
나는 보통 :
def change
execute("
ALTER TABLE your_table
ALTER COLUMN your_column
SET DEFAULT CURRENT_TIMESTAMP
")
end
그래서, 당신 schema.rb
은 다음과 같은 것을 갖게 될 것입니다.
create_table "your_table", force: :cascade do |t|
t.datetime "your_column", default: "now()"
end
If you need to change an existing DateTime column in Rails 5 (rather than creating a new table as specified in other answers) so that it can take advantage of the default date capability, you can create a migration like this:
class MakeStartsAtDefaultDateForFoo < ActiveRecord::Migration[5.0]
def change
change_column :foos, :starts_at, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
end
end
In the answer given by @szymon-lipiński (Szymon Lipiński), the execute method didn't work for me. It was throwing a MySQL syntax error.
The MySQL syntax which worked for me is this.
execute "ALTER TABLE mytable CHANGE `column_name` `column_name` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"
So to set the default value for a datetime column in migration script can be done as follows:
def up
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
execute "ALTER TABLE `foo` CHANGE `starts_at` `starts_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"
end
'Programing' 카테고리의 다른 글
Visual Studio 2010에서 텍스트 덮어 쓰기 (0) | 2020.08.15 |
---|---|
파일 업로드 버튼에 대한 브라우저 간 사용자 지정 스타일 지정 (0) | 2020.08.15 |
SublimeText는 줄을 흰색 직사각형으로 묶습니다. (0) | 2020.08.15 |
dict에서 빈 문자열이있는 키를 효율적으로 제거하는 방법 (0) | 2020.08.15 |
프래그먼트간에 값을 전달하는 방법 (0) | 2020.08.15 |