복붙노트

[RUBY-ON-RAILS] 액티브 / 레일의 updated_at 컬럼의 created_at 이름 바꾸기

RUBY-ON-RAILS

액티브 / 레일의 updated_at 컬럼의 created_at 이름 바꾸기

나는 timestamp.rb에 정의 된 타임 스탬프 열 이름을 변경합니다. timestamp.rb의 방법은 덮어 쓸 수 있습니다? 그리고 무엇을 가지고하는 것은 덮어 쓴 방법과 모듈이 사용하는 응용 프로그램에서 수행 할 수 있습니다.

해결법

  1. ==============================

    1.이 작업을 수행하는 간단한 방법은 없습니다. 당신이, 또는 당신을 위해 마술을 할 수있는 당신의 자신의 경로를 작성하여 액티브 :: 타임 스탬프 모듈을 재정 의하여 중이 작업을 수행 할 수 있습니다.

    이 작업을 수행하는 간단한 방법은 없습니다. 당신이, 또는 당신을 위해 마술을 할 수있는 당신의 자신의 경로를 작성하여 액티브 :: 타임 스탬프 모듈을 재정 의하여 중이 작업을 수행 할 수 있습니다.

    여기에 마법이 작동하는 방법이다.

  2. ==============================

    2.나는 NPatel의 방법은 올바른 접근이라고 생각하지만, 당신은 단지 하나의 모델 변경 #created_at해야하는 경우가 너무 많이하고있다. 타임 스탬프 모듈은 모든 AR 오브젝트에 포함되어 있기 때문에, 당신은 단지 모델 당을 오버라이드 (override)하지 세계적으로 수 있습니다.

    나는 NPatel의 방법은 올바른 접근이라고 생각하지만, 당신은 단지 하나의 모델 변경 #created_at해야하는 경우가 너무 많이하고있다. 타임 스탬프 모듈은 모든 AR 오브젝트에 포함되어 있기 때문에, 당신은 단지 모델 당을 오버라이드 (override)하지 세계적으로 수 있습니다.

    <= 5.0 레일

    class User < ActiveRecord::Base
      ...
      private
      def timestamp_attributes_for_create
        super << :registered_at
      end
    end
    

    ~> 5.1 레일

      private_class_method
      def self.timestamp_attributes_for_create
        # only strings allowed here, symbols won't work, see below commit for more details
        # https://github.com/rails/rails/commit/2b5dacb43dd92e98e1fd240a80c2a540ed380257 
        super << 'registered_at' 
      end
    end
    
  3. ==============================

    3.이것은 단지를 통해 액티브 :: 타임 스탬프 모듈 방법을 쓰기를 통해 수행 할 수 있습니다. 실제로 전체 모듈을 덮어 쓰지 않습니다. 나는 레거시 데이터베이스 작업을하고 나는이 같은 목표를 달성하기 위해해야합니다. 나는 레일 3와 나는 원숭이에 쓰기 기능을 레일을 통해 내 코드를 패치하는 방법의 방법론 다음 시작했습니다.

    이것은 단지를 통해 액티브 :: 타임 스탬프 모듈 방법을 쓰기를 통해 수행 할 수 있습니다. 실제로 전체 모듈을 덮어 쓰지 않습니다. 나는 레거시 데이터베이스 작업을하고 나는이 같은 목표를 달성하기 위해해야합니다. 나는 레일 3와 나는 원숭이에 쓰기 기능을 레일을 통해 내 코드를 패치하는 방법의 방법론 다음 시작했습니다.

    내가 먼저 초기화에 있음라는 파일을 내가 함께 일하고있는 기본 프로젝트를 생성하고 생성합니다. 이 경우에는 내가 active_record.rb를 만들었습니다. 그리고 파일 내에서 나는 타임 스탬프를 제어하는 ​​두 가지 방법을 무시하는 코드를 넣습니다. 다음은 내 코드의 샘플입니다 :

    module ActiveRecord
        module Timestamp      
          private
          def timestamp_attributes_for_update #:nodoc:
            ["updated_at", "updated_on", "modified_at"]
          end
          def timestamp_attributes_for_create #:nodoc:
            ["created_at", "created_on"]
          end      
        end
      end
    

    참고 : 나는 것 또한 원숭이 패치 이런 종류의 눈살을 찌푸리게되는 일에 물건을 얻을 및 업그레이드에 중단 될 수 있으므로주의하고 당신이 원하는 것이 무엇인지 숙지 할 것을 언급하고있다.

    업데이트 :

  4. ==============================

    4.당신은 당신의 특정 컬럼에 DateTime.now을 게시 할를 BeforeSave와 beforecreate 방법을 사용할 수 있습니다.

    당신은 당신의 특정 컬럼에 DateTime.now을 게시 할를 BeforeSave와 beforecreate 방법을 사용할 수 있습니다.

    class Sample < ActiveRecord::Base
      before_create :set_time_stamps
      before_save :set_time_stamps
    
      private
      def set_time_stamps
        self.created_column = DateTime.now if self.new_record?
        self.updated_column = DateTime.now
      end
    end
    
  5. ==============================

    5.원하는 열 이름과 CREATED_COL 및 UPDATED_COL 상수의 값을 대체 APPEND으로 environment.rb에 다음 빠른 추한 해킹, 밀란 Novota의 대답에서 정교화 :

    원하는 열 이름과 CREATED_COL 및 UPDATED_COL 상수의 값을 대체 APPEND으로 environment.rb에 다음 빠른 추한 해킹, 밀란 Novota의 대답에서 정교화 :

    
    module ActiveRecord
      module Timestamp
        CREATED_COL = 'created_at'
        UPDATED_COL = 'updated_at'
        private
          def create_with_timestamps #:nodoc:
            if record_timestamps
              t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
              write_attribute(CREATED_COL, t) if respond_to?(CREATED_COL) && send(CREATED_COL).nil?
              write_attribute(UPDATED_COL, t) if respond_to?(UPDATED_COL) && send(UPDATED_COL).nil?
            end
            create_without_timestamps
          end
    
          def update_with_timestamps(*args) #:nodoc:
            if record_timestamps && (!partial_updates? || changed?)
              t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
              write_attribute(UPDATED_COL, t) if respond_to?(UPDATED_COL)
            end
            update_without_timestamps(*args)
          end
      end
    end
    
  6. ==============================

    6.레일> = 5.1에 대한 업데이트 된 대답. 나는 응용 프로그램에서 기본적으로 사용할 수있는 ApplicationRecord를 사용하는 것이 좋습니다하고 다음을 정의합니다 :

    레일> = 5.1에 대한 업데이트 된 대답. 나는 응용 프로그램에서 기본적으로 사용할 수있는 ApplicationRecord를 사용하는 것이 좋습니다하고 다음을 정의합니다 :

    class ApplicationRecord < ActiveRecord::Base
      self.abstract_class = true
    
      class << self
        private
    
        def timestamp_attributes_for_create
          super << 'my_created_at_column'
        end
    
        def timestamp_attributes_for_update
          super << 'my_updated_at_column'
        end
      end
    end
    

    당신의 모든 모델을 구성하고자하는 경우, 당신은 또한 특정 모델에이 블록을 사용할 수 있습니다.

    당신이 문자열이 아니라 기호를 사용한다는 것을 유의하십시오.

  7. ==============================

    7.이있는 작업을 수행하기위한 정확한 구문 4.2 레일

    이있는 작업을 수행하기위한 정확한 구문 4.2 레일

    class User < ActiveRecord::Base
    ...
    
    private
    
        def timestamp_attributes_for_create
            super << 'date_add'
        end
    
        def timestamp_attributes_for_update
            super << 'date_update'
        end
    end
    
  8. ==============================

    8.또는 당신은 당신이 만들 때 자신의 열 (날짜 시간) 그냥 수동으로 설정 created_at 열을 확인하고 업데이트 할 때 updated_at 열을 설정할 수 있습니다. 즉 위의 해킹보다 더 쉬울 수 있습니다. 그건 내가 뭘할지. 더 나은 아직, 업데이트는 우리가이 이름을 변경할 수 있도록 레일.

    또는 당신은 당신이 만들 때 자신의 열 (날짜 시간) 그냥 수동으로 설정 created_at 열을 확인하고 업데이트 할 때 updated_at 열을 설정할 수 있습니다. 즉 위의 해킹보다 더 쉬울 수 있습니다. 그건 내가 뭘할지. 더 나은 아직, 업데이트는 우리가이 이름을 변경할 수 있도록 레일.

  9. ==============================

    9.원숭이 패치를 사용하지 않는 sol'n; 마이그레이션 중에 가역적 블록을 사용 :

    원숭이 패치를 사용하지 않는 sol'n; 마이그레이션 중에 가역적 블록을 사용 :

    class CreateTest < ActiveRecord::Migration
      def change
    
        create_table :test do |t|
        end
    
        # set the timestamp columns default to now()
        reversible do |dir|
          dir.up do
            tables = [
              :test
            ]
            tables.each do |t|
              execute <<-SQL
                ALTER TABLE #{t.to_s}
                  add column created timestamp without time zone default now();
              SQL
              execute <<-SQL
                ALTER TABLE #{t.to_s}
                  add column updated timestamp without time zone default now();
              SQL
            end
          end
          dir.down do
            # no need to do anything, the rollback will drop the tables
          end
        end
    
      end
    end
    
  10. from https://stackoverflow.com/questions/733630/renaming-the-created-at-updated-at-columns-of-activerecord-rails by cc-by-sa and MIT license