2011-01-04 5 views
2

query 테이블에 새 레코드를 만들 때 updated_at (타임 스탬프)가 현재 타임 스탬프가 아닌 '0000-00- 00 00:00:00' , Ruby on Rails가 기본적으로 설정됩니다.Ruby on Rails : updated_at - 생성시 0으로 설정

MySQL의 필드 :이 어떻게 해결합니까

INSERT INTO `queries` (`updated_at`) VALUES ('2011-01-04 17:40:15') 

:

`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP 

그러나, 루비 레일에이 SQL 쿼리를 생성?

답변

6

레일즈는 현재 시간이 updated_at으로 설정되어 있습니다. 왜냐하면 레코드가 가장 최근에 업데이트되었을 때입니다. 업데이트로 간주됩니다. 무언가가 업데이트되었는지 확인하려면 updated_atcreated_at이 같은지 확인하십시오.

그렇지 않으면 삽입시 삽입 된 값을 강제로 변경해야합니다.

Post.new(@params.merge({:updated_at => DateTime::new})

은 또는, 모델에 before_create 방법, self.updated_at = DateTime::new을 설정합니다. 당신이 타임 스탬프를 기록 건너 Rails을 원하는 경우에

+0

답이 더 나은 솔루션입니다 주제 – apneadiving

+1

조금 떨어져 보인다; Swanand의 솔루션은'updated_at'가 전혀 작동하지 않을 것이라는 것을 의미 할 것입니다. 여러분의 의도가 아니라 새로운 레코드가'updated_at' = 0이되기를 원합니다. – Karl

+1

어떻게 주제를 벗어나나요? 어쩌면 우리는 그 질문을 다르게 해석했을 것입니까? – hornairs

1

,이 API 활용할 수 :이 필드에 값을 할당하지 않습니다

ActiveRecord::Base.record_timestamps = false 
# This also works on individual models 
Post.record_timestamps = false 

Rails 이후 (더 적절 ActiveRecord)를, 당신의 DB는 기본값을 지정합니다 그 분야에.

0

나는 최근에 this blog post on the subject을 발견했습니다.

요약하면, 타임 스탬프 열을 사용하여 ActiveRecord의 기본 동작을 재정의하는 방법을 설명합니다 (예제 포함). ActiveRecord는 제공된 updated_at 정보를 실제로 무시하고 항상 자체 타임 스탬프를 사용한다고 설명합니다.

궁극적으로, 그는 원숭이 패치 액티브는 스레드 안전 만 모델의 행동이 작업중인 수정 타임 스탬프 을 비활성화하고 다시 활성화하는 작업을 수행 새로운 update_without_timestamping 방법을 제공합니다. 당신이 기사를 읽고 싶지 않은 경우

는, 그의 마지막 원숭이는 다음과 같이 코드는 패치 :

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