2009-08-10 2 views
32

레일즈는 많은 생각을 할 필요없이 올바르게 포맷 된 datetimes를 MySql에 자동으로 삽입하는 것이 좋았습니다.mysql 비교에 적합한 Ruby datetime

그러나 유효성 검사를 수행하기 위해 저장된 mysql datetime 값 (예 : 2008-07-02 18:00:00)이 "now"보다 크거나 작은 지 확인해야합니다. 내가 DateTime.now 또는 Time.now라고 부를 수는 있지만 어떻게 mysql이 좋아하는 형식으로 변환 할 수 있습니까?

감사

답변

83

당신은 데이터베이스 친화적 인 포맷으로 변환 할 수 to_s(:db)를 사용할 수 있습니다.

Time.now.to_s(:db) 

그러나 시간대가 데이터베이스의 UTC에 저장되므로 레일스에 시간대가 지정되어 있으면주의해야합니다. 적절한 비교를 위해이를 지정해야합니다.

Time.now.utc.to_s(:db) 

당신은 대신 루비의 현재 시간을 생성하는 MySQL의에서 NOW() 기능을 사용할 수 있습니다.

+15

감사합니다. railscasts 사람이 당신의 질문에 대답하도록하는 그 굉장한 :) – user94154

+1

이것은 정말로 선로의 방법이어야한다! – Hopstream

+0

100 고마워. 이 대답은 지금 NOW()의 존재를 상기 시켰습니다. 액티브 레코드는 확실히 나를 망쳤다. 나는 SQL을 거의 접하지 않기 때문에 Time.now를 지나쳤습니다. SQL (적어도 나를 위해)을 손으로 조정하는 시대는 끝났습니다. – Swartz

5

필요하지 않습니다. 레일 당신을 위해 일을하자 : 모델이 Widget입니다

경우,이 마지막 날에 생성 된 모든 위젯을 찾을 수 있습니다 :

Thing.find(:all, :condition => ["created_at > ?", Time.now - 1.day]) 

레일이 자동으로 올바른 형식으로 타임 스탬프를 변환합니다.

+0

응답에 감사드립니다. 그러나 이것은 나의 사용 사례에 맞지 않습니다. DB에서 이미 내 개체를 검색했습니다. 검색이 끝나면 오랜 시간이 걸리므로 시간 기반 검증을 실행해야합니다. 그래서 검사는 루비 코드에서 수행되어야하며 쿼리에서는 수행되지 않아야합니다. 다시 한번 고마워. – user94154

+0

나는 다른 시나리오를 가지고 있었고 완벽하게 작동했습니다. 감사. – aronchick

+0

레일즈 4+에서는'Thing.where ('created_at>?', 6.months.ago)'를 사용합니다. –

관련 문제