रेल एक्टिवरकॉर्ड द्वारा आज रिकॉर्ड कैसे बनाया जाए?


जवाबों:


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

पुनश्च: इस उत्तर को संशोधित किया गया है क्योंकि हरीश शेट्टी का उत्तर मेरे मुकाबले बेहतर था। जैसा कि मेरा जवाब एक स्वीकार किया जाता है। मैंने सामुदायिक समर्थन के लिए इस उत्तर को अपडेट किया है


4
: एक Post.where (Time.zone.now.beginning_of_day..Time.zone.now.end_of_day created_at) कर सकते हैं
राफेल ओलिविएरा

1
यह देखने के लिए जाँच करने का कोई मतलब नहीं है कि आज के अंत से पहले कुछ बनाया गया था (क्योंकि कल अभी तक नहीं हुआ है)।
जेकोनरायल्स

4
जबकि Post.where("created_at >= ?", Time.zone.now.beginning_of_day)बहुत चालाक है, मैं समर्थन करेंगे Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)। एक तरह से करने का एक बिंदु है जिससे आप समय में हेरफेर कर सकते हैं। उदाहरण के लिए, यदि आप परीक्षण कर रहे हैं, तो आप शायद समय में हेरफेर करेंगे और फिर पहला विकल्प काम नहीं करेगा। आप उस तरह की भविष्य की संभावित विफलता से बचना चाहते हैं जो शायद कुछ डिबग समय लेगी।
लुकासुरूदा

121

मुझे पता है कि इस सवाल का एक स्वीकृत जवाब है। तालिका में आकार बढ़ने पर स्वीकृत उत्तर में सुझाए गए समाधान प्रदर्शन की समस्या पैदा कर सकते हैं।

आमतौर पर, यदि आप created_atस्तंभ पर आधारित लुकअप करते हैं, तो अपनी माइग्रेशन फ़ाइल में तालिका पर एक इंडेक्स जोड़ें।

add_index :posts, :created_at

अब, आज बनाए गए रिकॉर्ड देखने के लिए:

रेल 3/4

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

किसी विशिष्ट दिन पर बनाए गए पोस्ट देखने के लिए।

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

--------- या -------------

अपने मॉडल में एक स्थिर विधि जोड़ें

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

Post.today #returns posts today

रेलें २

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

--------- या -------------

अपने मॉडल में एक name_scope जोड़ें

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

Post.today #returns posts today

1
अनुक्रमण के बारे में महान बिंदु। बस यह स्पष्ट करना चाहता था कि scopeइस पोस्ट में उदाहरण केवल रेल 3 के लिए है, क्योंकि ऐसा लगता है कि यह रेल्स 2 शीर्षक के तहत है। रेल 2 में, आपको इसके named_scopeबजाय उपयोग करने की आवश्यकता होगी scope। इसके अलावा, रेल 3 में, आप समान रूप से एक वर्ग विधि का उपयोग कर सकते हैं def self.today where("created_at >= ?", Time.now.beginning_of_day) end जो इस मामले में एक गुंजाइश का उपयोग करने की तुलना में संभवतः क्लीनर है, क्योंकि यह आपको लैम्ब्डा को त्यागने की अनुमति देता है।
evanrmurphy

@evanrmurphy, ध्यान देने के लिए धन्यवाद। मैंने जवाब तय कर दिया है।
हरीश शेट्टी

@evanrmurphy क्या आपको अपनी टिप्पणी "रेल 3 केवल" से "रेल 3 और अधिक" तक संशोधित करनी चाहिए?
kaichanvong

@kaicvong मैं रेल 4 से परिचित नहीं हूं, इसलिए मैं "रेल 3 (और अधिक?)" कहना चाहूंगा, लेकिन एसओ मुझे टिप्पणी को संपादित नहीं करने देंगे: - /
evanrmurphy

30

माई एसक्यूएल:

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

मोहित जैन का जवाब Rails3 के लिए अनुकूलित

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

16

रेल 5.1 में एक all_dayसहायक है जो यहां उपयोगी है।

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

या

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


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_periodदिलचस्प लग रहा है। मुझे इसके लिए कोई दस्तावेज नहीं मिला। क्या आप कुछ लिंक प्रदान कर सकते हैं? रेल तुलना के लिए कॉलम कैसे चुनती है?
हरीश शेट्टी

1

किसी कारण से, इस पोस्ट में अन्य समाधानों में से कोई भी और न ही स्टैकऑवरफ्लो पर अन्य लोगों ने मेरे लिए काम किया (रेल 4.2.4 और रूबी 2.2.3p173 का उपयोग करके)। यह एकमात्र प्रश्न है जो मुझे अपने पोस्टग्रैज डेटाबेस के साथ काम करने के लिए मिल सकता है:

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

-1

आज से बनाए गए रिकॉर्ड को क्वेरी करने के लिए

स्कोल के साथ गुंजाइश का उपयोग करें

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

तब हम इसका उपयोग कर सकते हैं

today_posts = Post.created_from_today

where('created_at >= now()')केवल उन्हीं वस्तुओं को खोजेगा जहां भविष्य में create_at था।
पीआर व्हाइटहेड

हाँ, मैं इसे जवाब से निकाल दूंगा, अच्छा पकड़ धन्यवाद
हियु फाम

अब आपके पास समस्या यह है कि भविष्य की तारीखों के साथ चिह्नित होने वाले रिकॉर्ड आज के लिए भी प्रस्तुत किए जाएंगे। यदि आप के बीच उपयोग से बचने की कोशिश कर रहे हैं, तो आपको भी निर्दिष्ट करना चाहिए .lteq(Time.zone.now.end_of_day))
पीआर वाइटहेड

-4

आज बनाए गए रिकॉर्ड प्राप्त करने के लिए रेल्स 4.2.3 में, mysql का उपयोग करके निम्नलिखित का उपयोग करें।

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

यहाँ मैं कई शर्तों का उपयोग कर रहा हूँ यदि आप चाहते हैं कि आप इसे एकल स्थिति के लिए संपादित कर सकें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.