Bugün oluşturulmuş tüm kayıtları almak istediğim zaman için koşullu ifadeyi nasıl yazmalıyım?
Bugün oluşturulmuş tüm kayıtları almak istediğim zaman için koşullu ifadeyi nasıl yazmalıyım?
Yanıtlar:
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
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.
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_at
sü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
scope
Bu 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_scope
yerine 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 .
Mohit Jain'in cevabı Rails3 için uyarlandı
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 all_day
burada 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)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Bu 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
ilginç 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?
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.
.lteq(Time.zone.now.end_of_day))
.
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.