Raylar aktivitesi kaydı ile bugün oluşturulmuş kayıt nasıl alınır?


Yanıtlar:


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

Not: Bu cevap, Harish Shetty'nin cevabı benimkinden daha iyi olduğu için değiştirildi. Cevabım kabul edildiği gibi biri. Topluluk desteği için bu yanıtı güncelledim


4
Post.where yapılabilir (created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
— Rafael Oliveira

1
Bugünün sonundan önce bir şeyin yaratılıp yaratılmadığını kontrol etmenin bir anlamı yok (yarın henüz gerçekleşmediğinden).
— jakeonrails

4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)Çok zekice olsa da onaylarım Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day). Zamanı manipüle edebileceğiniz bir şekilde yapmanın bir anlamı var. Örneğin, test yapıyorsanız, muhtemelen zamanı değiştireceksiniz ve o zaman ilk seçenek çalışmayacaktır. Muhtemelen hata ayıklama süresi alacak bu türden gelecekteki olası arızalardan kaçınmak istersiniz.
— lucasarruda

123

Bu sorunun kabul edilmiş bir cevabı olduğunu biliyorum. Kabul edilen cevapta önerilen çözüm, tablo boyutu büyüdüğünde performans sorunlarına neden olabilir.

Genellikle, created_atsütuna göre arama yapıyorsanız , geçiş dosyanızdaki tabloya bir dizin ekleyin.

add_index :posts, :created_at

Şimdi, bugün oluşturulan kayıtları aramak için:

Raylar 3/4

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

Belirli bir günde oluşturulan gönderileri aramak için.

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

--------- VEYA -------------

Modelinize statik bir yöntem ekleyin

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

Post.today #returns posts today

Raylar 2

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

--------- VEYA -------------

Modelinize bir named_scope ekleyin

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

Post.today #returns posts today

1
İndeksleme hakkında harika bir nokta. scopeBu gönderideki örneğin Rails 2 başlığı altında göründüğü için yalnızca Rails 3 için olduğunu açıklığa kavuşturmak istedim . Rails 2'de kullanmak named_scopeyerine kullanmanız gerekir scope. Ayrıca, Rails 3'te, def self.today where("created_at >= ?", Time.now.beginning_of_day) end lambdadan vazgeçmenize izin verdiği için, muhtemelen bu durumda bir kapsam kullanmaktan daha temiz olan bir sınıf yöntemini de kullanabilirsiniz .
— evanrmurphy

@evanrmurphy, bunu kaydettiğin için teşekkürler. Sabit cevabım var.
— Harish Shetty

@evanrmurphy, "Yalnızca Rails 3" ten "Rails 3 ve daha büyük" yorumunuzu revize edebilir / değiştirmelisiniz?
— kaichanvong

@kaichanvong Rails 4'e aşina değilim, bu yüzden "Rails 3 (ve daha üstü?)" demek istiyorum ama SO yorumu düzenlememe izin vermiyor: - /
— 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

Mohit Jain'in cevabı Rails3 için uyarlandı

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

16

Rails 5.1 all_dayburada yararlı olan bir yardımcıya sahiptir.

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

veya

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

9

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

Bu table_name,.


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_periodilginç görünüyor. Bunun için herhangi bir belge bulamadım. Bağlantı sağlayabilir misin? Raylar karşılaştırma için sütunu nasıl seçer?
— Harish Shetty

1

Nedense, bu gönderideki diğer çözümlerin hiçbiri ve StackOverflow'daki diğerleri benim için işe yaramadı (Rails 4.2.4 ve Ruby 2.2.3p173 kullanarak). Postgres veritabanımla çalışabildiğim tek sorgu bu:

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

-1

Bugünden oluşturulan kayıtları sorgulamak için

Arel ile kapsam kullanın

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

O zaman kullanabiliriz

today_posts = Post.created_from_today

where('created_at >= now()')yalnızca created_at öğesinin gelecekte olduğu öğeleri bulur.
— PR Whitehead

Evet, cevaptan
— çıkarırdım

Şu anda sahip olduğunuz sorun, gelecek tarihlerle işaretlenmiş kayıtların bugün için olduğu gibi sunulacak olmasıdır. Arasını kullanmaktan kaçınmaya çalışıyorsanız, bunu da belirtmelisiniz .lteq(Time.zone.now.end_of_day)).
— PR Whitehead

-4

Raylarda 4.2.3 mysql kullanarak bugün oluşturulan kayıtları almak için aşağıdakileri kullanın.

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

burada birden çok koşul kullanıyorum, isterseniz tek koşul için düzenleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.