기존 테이블 에 타임 스탬프 ( created_at
& updated_at
) 를 추가해야 합니다. 다음 코드를 시도했지만 작동하지 않았습니다.
class AddTimestampsToUser < ActiveRecord::Migration
def change_table
add_timestamps(:users)
end
end
답변
타임 스탬프 도우미는 create_table
블록 에서만 사용할 수 있습니다 . 열 유형을 수동으로 지정하여 이러한 열을 추가 할 수 있습니다.
class AddTimestampsToUser < ActiveRecord::Migration
def change_table
add_column :users, :created_at, :datetime, null: false
add_column :users, :updated_at, :datetime, null: false
end
end
add_timestamps
위에서 지정한 방법 과 동일한 간결한 구문 이 없지만 Rails는 여전히 이러한 열을 타임 스탬프 열로 취급하고 값을 정상적으로 업데이트합니다.
답변
마이그레이션은 두 가지 클래스 메소드 (또는 3.1의 인스턴스 메소드) up
와 down
(그리고 때로는 change
3.1 의 인스턴스 메소드)입니다. 변경 사항이 up
메소드에 적용되기를 원합니다 .
class AddTimestampsToUser < ActiveRecord::Migration
def self.up # Or `def up` in 3.1
change_table :users do |t|
t.timestamps
end
end
def self.down # Or `def down` in 3.1
remove_column :users, :created_at
remove_column :users, :updated_at
end
end
3.1에 있다면 change
Dave를 사용할 수도 있습니다 .
class AddTimestampsToUser < ActiveRecord::Migration
def change
change_table(:users) { |t| t.timestamps }
end
end
아마 당신은 혼란하고 def change
, def change_table
하고 change_table
.
자세한 내용은 마이그레이션 안내서 를 참조 하십시오.
답변
원래 코드는 매우 가까이에 있으므로 다른 메소드 이름 만 사용해야합니다. Rails 3.1 이상을 사용하는 경우 다음 change
대신 메소드 를 정의해야합니다 change_table
.
class AddTimestampsToUser < ActiveRecord::Migration
def change
add_timestamps(:users)
end
end
이전 버전을 사용하는 경우 대신 다음 up
과 down
대신 메소드 를 정의해야합니다 change_table
.
class AddTimestampsToUser < ActiveRecord::Migration
def up
add_timestamps(:users)
end
def down
remove_timestamps(:users)
end
end
답변
@ user1899434의 응답은 여기에 “기존”테이블이 이미 레코드가 포함 된 테이블을 의미 할 수 있다는 사실에서 발견되었습니다. 따라서 기본값 인 null 인 false : false를 사용하여 타임 스탬프를 추가하면 기존 레코드가 모두 유효하지 않습니다.
그러나 두 단계를 하나의 마이그레이션으로 결합하고보다 의미있는 add_timestamps 메소드를 사용하면 대답을 향상시킬 수 있다고 생각합니다.
def change
add_timestamps :projects, default: Time.zone.now
change_column_default :projects, :created_at, nil
change_column_default :projects, :updated_at, nil
end
DateTime.now
대신 새벽에 기존 레코드를 생성 / 업데이트하려는 경우와 같이 다른 타임 스탬프를 대신 사용할 수 있습니다.
답변
class AddTimestampsToUser < ActiveRecord::Migration
def change
change_table :users do |t|
t.timestamps
end
end
end
사용 가능한 변환은
change_table :table do |t|
t.column
t.index
t.timestamps
t.change
t.change_default
t.rename
t.references
t.belongs_to
t.string
t.text
t.integer
t.float
t.decimal
t.datetime
t.timestamp
t.time
t.date
t.binary
t.boolean
t.remove
t.remove_references
t.remove_belongs_to
t.remove_index
t.remove_timestamps
end
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/Table.html
답변
Nick Davies의 답변 은 기존 데이터가있는 테이블에 타임 스탬프 열을 추가 할 때 가장 완벽합니다. 그것의 유일한 단점은 그것이 올릴 것입니다 ActiveRecord::IrreversibleMigration
켜짐 db:rollback
.
양방향으로 작동하도록 수정해야합니다.
def change
add_timestamps :campaigns, default: DateTime.now
change_column_default :campaigns, :created_at, from: DateTime.now, to: nil
change_column_default :campaigns, :updated_at, from: DateTime.now, to: nil
end
답변
def change
add_timestamps :table_name
end