Quero obter todos os registros em que o campo created_at seja menor que hoje (uma data). Existe algo como:
MyTable.find_by_created_at(< 2.days.ago)
ruby
activerecord
Sayuj
fonte
fonte
MyTable1.where(MyTable[:created_at] < Time.now)
é possível?Para obter todos os registros
MyTable
criados até 2 dias atrás:MyTable.where(created_at: Date.new..2.days.ago)
Observe que você também pode procurar registros com campos contendo campos no futuro de maneira semelhante, ou seja, obter todos os registros
MyTable
comevent_date
pelo menos 2 dias a partir de agora:MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)
fonte
"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
Outra maneira é criar um escopo em
MyModel
ou noApplicationRecord
uso da interface Arel como tokland sugerido em sua resposta assim:scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }
Exemplo de uso do escopo:
MyModel.arel(:created_at, :lt, 2.days.ago)
Para todas as previsões, verifique a documentação ou o código-fonte . Este escopo não quebra a
where
cadeia. Isso significa que você também pode fazer:MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2
fonte
ActiveRecord::Relation
define um método de instância com o nome, oarel
que significa que você só precisa escolher um nome diferente.Time.now se refere a agora ou neste exato segundo. Então, para encontrar todos os usuários antes de agora, basta usar
Isso encontrará todos os usuários anteriores agora e excluirá futuros usuários ou usuários que ingressarem após Time.now
fonte