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.