활성 레코드-오늘 이전에 생성 된 레코드 찾기


87

created_at 필드가 오늘 (날짜)보다 적은 모든 레코드를 가져오고 싶습니다. 다음과 같은 것이 있습니까?

MyTable.find_by_created_at(< 2.days.ago)

답변:


169

표준 방식으로 ActiveRecord 사용 :

MyModel.where("created_at < ?", 2.days.ago)

기본 Arel 인터페이스 사용 :

MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))

Arel 위에 얇은 레이어 사용 :

MyModel.where(MyModel[:created_at] < 2.days.ago)

squeel 사용 :

MyModel.where { created_at < 2.days.ago }

감사!. 동일한 조건에서 MyTable과 일대일 관계인 MyTable1의 모든 레코드가 필요한 경우 쿼리를 작성하는 방법은 무엇입니까? 나는 MyTable1.where(MyTable[:created_at] < Time.now)그것이 가능한 것과 같은 것을 언급하고 있었습니까?
Sayuj 2011

예, 관계 활성 레코드 클래스를 설정했습니다.
Sayuj 2011

11

MyTable2 일 전까지 생성 된 모든 레코드를 가져 오려면 다음을 수행하십시오 .

MyTable.where(created_at: Date.new..2.days.ago)

당신은 또한 필드의 모든 레코드를 얻을 즉, 유사한 방법으로 미래의 필드를 포함하여 기록도 찾아보실 수 있습니다 MyTable으로 event_date지금부터 적어도 이일 :

MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)

이것은 생산합니다"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Pavel Chuchuva

2

또 다른 방법은 다음 과 같이 대답 에서 tokland sugensted 와 같은 Arel 인터페이스 MyModelApplicationRecord사용 하거나 사용하여 범위를 만드는 것입니다 .

scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }

범위 사용 예 :

MyModel.arel(:created_at, :lt, 2.days.ago)

모든 술어에 대해서는 문서 또는 소스 코드를 확인하십시오 . 이 범위는 where사슬을 끊지 않습니다 . 이는 다음을 수행 할 수도 있음을 의미합니다.

MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2

기상. 그러나 ActiveRecord::Relation이름으로 인스턴스 메서드를 정의 arel하므로 다른 이름을 선택하기 만하면됩니다.
M-Dahab

-36

Time.now는 지금 또는이 순간을 나타냅니다. 따라서 지금 이전에 모든 사용자를 찾으려면

@users = User.all

이것은 지금 이전의 모든 사용자를 찾고 Time.now 이후에 가입하는 향후 사용자 또는 사용자를 제외합니다.


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