सक्रिय रिकॉर्ड - आज से पहले रिकॉर्ड बनाए गए थे


87

मैं उन सभी रिकॉर्ड्स को प्राप्त करना चाहता हूं, जहां create_at फ़ील्ड आज (एक तारीख) से कम है। क्या ऐसा कुछ है:

MyTable.find_by_created_at(< 2.days.ago)

जवाबों:


167

ActiveRecord का मानक तरीके से उपयोग करना :

MyModel.where("created_at < ?", 2.days.ago)

अंतर्निहित Arel इंटरफ़ेस का उपयोग करना :

MyModel.where(MyModel.arel_table[:created_at].lt(2.days.ago))

Arel पर एक पतली परत का उपयोग करना :

MyModel.where(MyModel[:created_at] < 2.days.ago)

स्क्वील का उपयोग करना :

MyModel.where { created_at < 2.days.ago }

धन्यवाद!। अगर मुझे MyTable1 से सभी रिकॉर्ड चाहिए जो एक ही शर्त पर MyTable के साथ एक संबंध है, तो क्वेरी कैसे लिखें? मैं कुछ का उल्लेख कर रहा था जैसे MyTable1.where(MyTable[:created_at] < Time.now)यह संभव है?
सायुज

हां मैंने रिलेशन एक्टिव रिकॉर्ड क्लास सेट किया है।
Sayuj

11

MyTable2 दिन पहले तक बनाए गए सभी रिकॉर्ड प्राप्त करने के लिए :

MyTable.where(created_at: Date.new..2.days.ago)

ध्यान दें कि आप भविष्य में इसी तरह से फ़ील्ड वाले फ़ील्ड के रिकॉर्ड भी देख सकते हैं, यानी अब से कम से कम 2 दिनों के MyTableसाथ सभी रिकॉर्ड प्राप्त करने के लिए event_date:

MyTable.where(event_date: 2.days.from_now..DateTime::Infinity.new)

यह पैदा करता है"created_at" BETWEEN $1 AND $2 [["created_at", "4713-01-01 BC"], ["created_at", "2020-03-31 21:43:28.113759"]]
पावेल Chuchuva

2

एक अन्य तरीका यह है कि इस तरह से अपने उत्तर में टोकेल सुजेनस्टेड की तरह Arel इंटरफ़ेस का उपयोग करके MyModelया इसमें एक स्कोप बनाया जाए:ApplicationRecord

scope :arel, ->(column, predication, *args) { where(arel_table[column].public_send(predication, *args)) }

गुंजाइश का उदाहरण उपयोग:

MyModel.arel(:created_at, :lt, 2.days.ago)

सभी विधेय के लिए, दस्तावेज़ या स्रोत कोड की जाँच करें । यह गुंजाइश whereश्रृंखला को नहीं तोड़ती है । इसका मतलब आप यह भी कर सकते हैं:

MyModel.custom_scope1.arel(:created_at, :lt, 2.days.ago).arel(:updated_at, :gt, 2.days.ago).custom_scope2

विलक्षण विचार। लेकिन, ActiveRecord::Relationनाम के साथ एक उदाहरण विधि को परिभाषित करता है arelजिसका अर्थ है कि आपको बस एक अलग नाम चुनने की आवश्यकता है।
M-Dahab

-36

Time.now का तात्पर्य अभी है या यह दूसरा है। तो अभी से पहले सभी उपयोगकर्ताओं को खोजने के लिए अभी उपयोग करें

@users = User.all

यह सभी उपयोगकर्ताओं को अभी से पहले मिल जाएगा और भविष्य के उपयोगकर्ताओं या उपयोगकर्ताओं को बाहर कर देगा जो Time.now के बाद जुड़ते हैं


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