[ruby-on-rails] 기존 테이블에 타임 스탬프 추가

기존 테이블 에 타임 스탬프 ( 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의 인스턴스 메소드) updown(그리고 때로는 change3.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에 있다면 changeDave를 사용할 수도 있습니다 .

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

이전 버전을 사용하는 경우 대신 다음 updown대신 메소드 를 정의해야합니다 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