복붙노트

[RUBY-ON-RAILS] 레일 타임 스탬프 필드를 업데이트 자동으로 방지 할 수있는 방법이 있나요?

RUBY-ON-RAILS

레일 타임 스탬프 필드를 업데이트 자동으로 방지 할 수있는 방법이 있나요?

당신이 created_at과 레일 updated_at DB 열이있는 경우 모델 객체를 생성하고 업데이트 할 때 자동으로 해당 값을 설정합니다. 그 열을 건드리지 않고 모델을 저장하는 방법이 있나요?

좀 레거시 데이터 초래하고 있고 나는 (다른 이름) 레거시 데이터 필드에 해당 값에서 해당 값을 설정하고 싶습니다. 나는 모델을 설정 한 다음 모델을 저장, 레일 들어오는 값을 대체하기 위해 나타날 때 내가 찾는거야.

물론 난 그냥 그것을 방지하기 위해 다르게 레일 모델의 열 이름을 수 있지만, 데이터를 가져온 후, 나는 레일이 자동 타임 스탬프 일을하고 싶다.

해결법

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

    1.(당신이 가장자리 레일 인 경우 또는 새 데이터베이스 씨앗) 마이그레이션이나 레이크 작업에서이 작업을 수행합니다 :

    (당신이 가장자리 레일 인 경우 또는 새 데이터베이스 씨앗) 마이그레이션이나 레이크 작업에서이 작업을 수행합니다 :

    ActiveRecord::Base.record_timestamps = false
    begin
      run_the_code_that_imports_the_data
    ensure
      ActiveRecord::Base.record_timestamps = true  # don't forget to enable it again!
    end
    

    안전하게 created_at을 설정하고 수동으로 updated_at, 레일 불평하지 않습니다.

    노트 :     이것은 또한 개별 모델, 예를 들어, 작동      User.record_timestamps = 거짓

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

    2.대신 방법을 update_column 사용

    대신 방법을 update_column 사용

    http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

    update_column(name, value)
    # Updates a single attribute of an object, without calling save.
    

    검증이 생략됩니다.

    콜백은 건너 뜁니다.

    updated_at / updated_on 열은 해당 열을 사용할 수있는 경우 업데이트되지 않습니다.

    새로운 개체를 호출 할 때, 또는 이름 속성이 읽기 전용으로 표시 될 때 ActiveRecordError를 발생시킵니다.

  3. ==============================

    3.(5)가 그것의 타임 스탬프 updated_at를 업데이트하지 않고 레코드를 업데이트 할 수있는 편리한 방법을 제공 레일 : https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

    (5)가 그것의 타임 스탬프 updated_at를 업데이트하지 않고 레코드를 업데이트 할 수있는 편리한 방법을 제공 레일 : https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

    귀하의 기록을 업데이트하는 동안 거짓 : 당신은 단지 터치를 통과해야합니다.

    >> user = User.first
    >> user.updated_at
    => Thu, 28 Apr 2016 20:01:57 IST +05:30
    >> user.name = "Jose"
    >> user.save(touch: false)
    => true
    
    >> user.updated_at
    => Thu, 28 Apr 2016 20:01:57 IST +05:30
    
  4. ==============================

    4.당신은 당신의 마이그레이션 안에 다음을 설정할 수 있습니다 :

    당신은 당신의 마이그레이션 안에 다음을 설정할 수 있습니다 :

    ActiveRecord::Base.record_timestamps = false
    

    또는 altenatively 사용 update_all :

  5. ==============================

    5.레일에서 3+, 하나의 객체에 대해, 세트는 객체가 아닌 클래스 record_timestamps. 즉,

    레일에서 3+, 하나의 객체에 대해, 세트는 객체가 아닌 클래스 record_timestamps. 즉,

    >> user = User.first
    >> user.updated_at
    => Tue, 12 Apr 2016 22:47:51 GMT +00:00
    >> user.name = "Jose"
    => "Jose"
    >> user.record_timestamps = false
    >> user.save
    => true
    >> user.updated_at
    => Tue, 12 Apr 2016 22:47:51 GMT +00:00
    >> User.record_timestamps
    => true
    

    이 방법을 사용하면 모델에 대한 글로벌 상태를 만지지 않으며, 당신은 보장 블록의 이전 설정을 복원 기억할 필요가 없습니다.

  6. ==============================

    6.이 일회성 가져 오기 때문에 다음 작업을 수행 할 수 있습니다 :

    이 일회성 가져 오기 때문에 다음 작업을 수행 할 수 있습니다 :

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

    7.나는 일시적으로 블록에 타임 스탬프를 해제하는 믹스 인 모듈을 사용하려면 :

    나는 일시적으로 블록에 타임 스탬프를 해제하는 믹스 인 모듈을 사용하려면 :

    module WithoutTimestamps
      def without_timestamps
        old = ActiveRecord::Base.record_timestamps
        ActiveRecord::Base.record_timestamps = false
        begin
          yield
        ensure
          ActiveRecord::Base.record_timestamps = old
        end
      end
    end
    

    당신이 그것을 필요로 할 때마다 그런 다음 당신은 그것을 사용할 수 있습니다

    class MyModel < ActiveRecord::Base
      include WithoutTimestamps
    
      def save_without_timestamps
        without_timestamps do
          save!
        end
      end
    end
    

    아니면 그냥 일회성이 같은 :

    m = MyModel.find(1)
    WithoutTimestamps.without_timestamps do
      m.save!
    end
    
  8. ==============================

    8.때 아닌 대량 가져 오기에, 당신은 should_record_timestamps을 무시할 수 있습니까? 모델에 대한 방법은 updated_at 열을 업데이트 할 때 새로운 검사를 추가 할 수 있습니다.

    때 아닌 대량 가져 오기에, 당신은 should_record_timestamps을 무시할 수 있습니까? 모델에 대한 방법은 updated_at 열을 업데이트 할 때 새로운 검사를 추가 할 수 있습니다.

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

    9.다른 답변을 참조하면, 나는 놀랍게도 발견처럼 단일 모델에 대한 타임 스탬프를 사용하지 :

    다른 답변을 참조하면, 나는 놀랍게도 발견처럼 단일 모델에 대한 타임 스탬프를 사용하지 :

    User.record_timestamps = false
    

    다른 서버에서 실행 내 사전 프로덕션 데이터베이스에 내 개발 데이터베이스 일 수 있지만. 그러나 모든 모델에 대한 경우 I 해제 타임 스탬프를 작동

    ActiveRecord::Base.record_timestamps = false
    

    (상황 : 마이그레이션에 created_at 속성을 수정)

  10. ==============================

    10.또는, 스레드 안전을 위해, 참조 : http://www.hungryfools.com/2007/07/turning-off-activerecord-timestamp.html

    또는, 스레드 안전을 위해, 참조 : http://www.hungryfools.com/2007/07/turning-off-activerecord-timestamp.html

  11. ==============================

    11.나는 액티브 :: Base.record_timestamps 플래그 변경 아무것도 할 수없는, 그리고 유일한 작업 방법은 액티브 :: Base.no_touching을 {} 사용하고 있습니다 :

    나는 액티브 :: Base.record_timestamps 플래그 변경 아무것도 할 수없는, 그리고 유일한 작업 방법은 액티브 :: Base.no_touching을 {} 사용하고 있습니다 :

    ActiveRecord::Base.no_touching do
      Project.first.touch  # does nothing
      Message.first.touch  # does nothing
    end
    
    Project.no_touching do
      Project.first.touch  # does nothing
      Message.first.touch  # works, but does not touch the associated project
    end
    

    여기에서 촬영.

    사용자가 created_at 또는 속성 updated_at 의존 또는 그 컬럼을 정렬로 사용하면서, 당신은 깊이 관련 모델의 일부 속성을 재정의해야하고 내부 콜백에 대해 귀찮게하지 않으려는 레이크 작업에 매우 유용합니다.

  12. ==============================

    12.나는 파티에 늦게 해요 그러나 이것은 우리가 내 가게에서 updated_at 업데이트를 생략하는 방법이다 :

    나는 파티에 늦게 해요 그러나 이것은 우리가 내 가게에서 updated_at 업데이트를 생략하는 방법이다 :

    # config/initializers/no_timestamping.rb
    module ActiveRecord
      class Base
    
        def update_record_without_timestamping
          class << self
            def record_timestamps; false; end
          end
    
          save!
    
          class << self
            remove_method :record_timestamps
          end
        end
    
      end
    end
    

    용법:

    post.something = 'whatever'
    post.update_record_without_timestamping
    
  13. from https://stackoverflow.com/questions/861448/is-there-a-way-to-avoid-automatically-updating-rails-timestamp-fields by cc-by-sa and MIT license