Bagaimana saya harus menulis pernyataan bersyarat ketika saya ingin mendapatkan semua rekaman yang dibuat hari ini?
Bagaimana saya harus menulis pernyataan bersyarat ketika saya ingin mendapatkan semua rekaman yang dibuat hari ini?
Jawaban:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Jawaban ini sudah dimodifikasi karena jawaban Harish Shetty lebih baik dari saya. Karena jawaban saya diterima. Saya telah memperbarui jawaban ini untuk dukungan komunitas
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
sangat pintar, saya akan mendukung Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Ada gunanya melakukan dengan cara yang dapat Anda lakukan untuk memanipulasi waktu. Misalnya, jika Anda menguji, Anda mungkin akan memanipulasi waktu dan kemudian opsi pertama tidak akan berfungsi. Anda ingin menghindari kemungkinan kegagalan di masa mendatang yang mungkin memerlukan waktu debug.
Saya tahu pertanyaan ini memiliki jawaban yang diterima. Solusi yang disarankan dalam jawaban yang diterima dapat menyebabkan masalah kinerja saat ukuran tabel bertambah.
Biasanya, jika Anda melakukan pencarian berdasarkan created_at
kolom, tambahkan indeks pada tabel di file migrasi Anda.
add_index :posts, :created_at
Sekarang, untuk mencari rekaman yang dibuat hari ini:
Rel 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Untuk mencari postingan yang dibuat pada hari tertentu.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- ATAU -------------
Tambahkan metode statis ke model Anda
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Rel 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- ATAU -------------
Tambahkan name_scope ke model Anda
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
contoh dalam posting ini hanya untuk Rails 3, karena sepertinya berada di bawah judul Rails 2. Di Rails 2, Anda harus menggunakan named_scope
daripada scope
. Selain itu, di Rails 3, Anda dapat menggunakan metode kelas yang setara def self.today where("created_at >= ?", Time.now.beginning_of_day) end
yang mungkin lebih bersih daripada menggunakan cakupan dalam kasus ini, karena memungkinkan Anda untuk mengabaikan lambda.
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
Jawaban Mohit Jain diadaptasi untuk Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 memiliki all_day
helper yang berguna di sini.
Post.where(created_at: Date.today.all_day)
atau
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Ini "Namescopes" atribut dengan table_name
.
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
between_period
terlihat menarik. Saya tidak menemukan dokumentasi apa pun untuk itu. Bisakah Anda memberikan beberapa tautan? Bagaimana rel memilih kolom untuk perbandingan?
Untuk beberapa alasan, tidak ada solusi lain di posting ini atau yang lain di StackOverflow yang berfungsi untuk saya (menggunakan Rails 4.2.4 dan Ruby 2.2.3p173). Ini adalah satu-satunya kueri yang dapat saya gunakan dengan database Postgres saya:
Post.where("created_at >= TIMESTAMP 'now'")
Untuk menanyakan catatan yang dibuat mulai hari ini
Gunakan ruang lingkup dengan arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
Lalu kita bisa menggunakannya
today_posts = Post.created_from_today
where('created_at >= now()')
hanya akan menemukan item di mana create_at berada di masa mendatang.
.lteq(Time.zone.now.end_of_day))
juga.
Di rel 4.2.3 untuk mendapatkan catatan yang dibuat hari ini, menggunakan mysql gunakan yang berikut ini.
@usergoals = Goal.where ("userid =: userid dan Tanggal (create_at) =: date", {userid: params [: id], date: Date.today})
di sini saya menggunakan beberapa kondisi jika Anda mau, Anda dapat mengeditnya untuk satu kondisi.