Rails ActiveRecord에서 오늘 만든 레코드를 얻는 방법은 무엇입니까?


답변:


220
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

추신 :이 답변은 Harish Shetty의 답변이 저보다 낫기 때문에 수정되었습니다. 내 대답이 받아 들여지기 때문에. 커뮤니티 지원을 위해이 답변을 업데이트했습니다.


4
: 하나는 Post.where (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day created_at) 할 수
라파엘 올리베이라

1
오늘이 끝나기 전에 무언가가 만들어 졌는지 확인할 필요가 없습니다 (아직 내일이 일어나지 않았기 때문에).
jakeonrails

4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)매우 영리 하지만 Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day). 시간을 조작 할 수있는 방식으로해야 할 요점이 있습니다. 예를 들어, 테스트하는 경우 시간을 조작하고 첫 번째 옵션이 작동하지 않습니다. 디버그 시간이 걸릴 수있는 이러한 종류의 향후 가능한 오류를 방지하려고합니다.
lucasarruda

123

이 질문에 허용 된 답변이 있음을 알고 있습니다. 수락 된 답변에서 제안 된 솔루션은 테이블 크기가 커질 때 성능 문제를 일으킬 수 있습니다.

일반적으로 created_at열을 기준으로 조회를 수행하는 경우 마이그레이션 파일의 테이블에 인덱스를 추가합니다.

add_index :posts, :created_at

이제 오늘 생성 된 레코드를 조회하려면 :

레일 3/4

Post.where("created_at >= ?", Time.zone.now.beginning_of_day)

특정 날짜에 작성된 게시물을 조회합니다.

Post.where(:created_at => (date.beginning_of_day..date.end_of_day))

--------- 또는 -------------

모델에 정적 메서드 추가

class Post < ActiveRecord::Base
  def self.today
    where("created_at >= ?", Time.zone.now.beginning_of_day)
  end
end

Post.today #returns posts today

레일스 2

Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])

--------- 또는 -------------

모델에 named_scope 추가

class Post < ActiveRecord::Base    
  named_scope :today, lambda { 
    {
      :conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
    }
  }
end

Post.today #returns posts today

1
인덱싱에 대한 좋은 점. scope이 게시물 의 예제는 Rails 2 제목 아래에있는 것처럼 보이므로 Rails 3 전용 이라는 것을 명확히하고 싶었습니다 . 레일 2, 당신은 사용해야 할 것 named_scope보다는 scope. 또한 Rails 3에서는 def self.today where("created_at >= ?", Time.now.beginning_of_day) end 람다를 무시할 수 있기 때문에이 경우 범위를 사용하는 것보다 더 깨끗한 클래스 메서드 를 동등하게 사용할 수 있습니다.
evanrmurphy

@evanrmurphy, 주목 해 주셔서 감사합니다. 정답이 있습니다.
Harish Shetty

@evanrmurphy 코멘트를 "레일 3 전용"에서 "레일 3 이상"으로 수정할 수 있습니까?
kaichanvong

@kaichanvong 저는 Rails 4에 익숙하지 않아서 "Rails 3 (이상?)"이라고 말하고 싶지만 코멘트를 편집 할 수는 없습니다. :-/
evanrmurphy

30

MySQL :

Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3

PostgreSQL :

Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3

19

Rails3에 적합한 Mohit Jain의 답변

Model.where "DATE(created_at) = DATE(?)", Time.now

16

Rails 5.1에는 all_day여기에 유용한 도우미가 있습니다.

Post.where(created_at: Date.today.all_day)

또는

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)


5

model.rb

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }

posts_controller.rb

Post.posted_today

2
@Pathiv, 흥미로워 between_period보입니다. 나는 그것에 대한 문서를 찾지 못했습니다. 링크를 제공 할 수 있습니까? 레일은 비교를 위해 컬럼을 어떻게 선택합니까?
Harish 셰티

1

어떤 이유로이 게시물의 다른 솔루션이나 StackOverflow의 다른 솔루션이 저에게 효과적이지 않았습니다 (Rails 4.2.4 및 Ruby 2.2.3p173 사용). 이것은 Postgres 데이터베이스로 작업 할 수있는 유일한 쿼리입니다.

Post.where("created_at >= TIMESTAMP 'now'")

-1

오늘부터 생성 된 레코드를 조회하려면

arel과 함께 범위 사용

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
  }
end

그럼 우리는 그것을 사용할 수 있습니다

today_posts = Post.created_from_today

where('created_at >= now()')created_at가 미래에 있었던 항목 만 찾습니다.
PR Whitehead

그래 나는 대답에서 좋은 캐치 감사를 제거 것
Hieu 팜

현재 문제는 미래 날짜가 표시된 레코드가 오늘의 레코드와 함께 표시된다는 것입니다. between을 사용하지 않으려는 경우 .lteq(Time.zone.now.end_of_day))에도 지정해야 합니다.
PR Whitehead

-4

오늘 생성 된 레코드를 얻기위한 rails 4.2.3에서는 mysql을 사용하여 다음을 사용합니다.

@usergoals = Goal.where ( "userid = : userid and Date (created_at) = : date", {userid : params [: id], date : Date.today})

여기에서는 단일 조건에 대해 편집 할 수있는 경우 여러 조건을 사용하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.