2011-02-02 12 views
45

मैं सोच रहा था कि क्या रेलवे 3 में किसी तालिका में नवीनतम रिकॉर्ड खोजने का कोई तरीका है?रेल 3 में नवीनतम रिकॉर्ड खोजें

धन्यवाद

इलियट

+0

हमें उस तालिका के बारे में और जानने की आवश्यकता है जिसके बारे में आप बात कर रहे हैं। क्या कोई डेटाटाइम फ़ील्ड है जो रिकॉर्ड जोड़ा जाता है और/या बदला जाता है जब स्वचालित रूप से अपडेट किया जाता है? –

उत्तर

98

एक पोस्ट मॉडल को देखते हुए, आप @post = Post.order("created_at").last

(कारण मैं सिर्फ ऐसा नहीं किया कर सकता है @post = Post.last ऐसा करें क्योंकि यह हमेशा आपकी प्राथमिक कुंजी (आमतौर पर id) द्वारा क्रमबद्ध करने के लिए डिफ़ॉल्ट होता है। समय यह ठीक है, लेकिन मुझे यकीन है कि एक परिदृश्य है जहां इससे समस्याएं पैदा हो सकती हैं (उदा। रिकॉर्ड्स पर कस्टम आईडी सेट करना, डेटाबेस परिवर्तन जो प्राथमिक कुंजी अनुक्रमण/ऑटोनंबरिंग आदि को प्रभावित करते हैं)। created_at टाइमस्टैम्प द्वारा सॉर्टिंग सुनिश्चित करता है कि आपको वास्तव में सबसे हालिया रिकॉर्ड मिल रहा है)।

+9

इस विधि का उपयोग करते हुए उस create_at फ़ील्ड को इंडेक्स करना सुनिश्चित करें। – jemminger

+1

मैं 'pre_validation' हुक में काम नहीं करूंगा। – Green

+1

रेल 4 में, आप पोस्ट मॉडल में 'default_scope {order (created_at:: asc)}' पंक्ति भी जोड़ सकते हैं ताकि यह सुनिश्चित किया जा सके कि 'Post.last' अपेक्षित व्यवहार करता है। – sambecker

1

कोशिश, एक मॉडल ModelName नामित के लिए:

record = ModelName.last 
+2

यह तालिका के लिए सॉर्ट ऑर्डर को ध्यान में रखता नहीं है। Postgres डेटाबेस – jamesc

+1

का उपयोग करते हुए यह असफल हो जाएगा ... यह असफल हो जाएगा ... बढ़िया। असफल होने से बचने के लिए आप क्या करेंगे? –

3

हाँ, आप .last

तो विधि, अगर आपका मॉडल पोस्ट तो कहा जाता है का उपयोग कर सकते हैं:

>> Post.last 
=> #<Post ...> 
18

जबकि dmarkow के जवाब तकनीकी रूप से सही है, तो आप created_at पर एक सूचकांक बनाने की आवश्यकता होगी या आपके डेटाबेस बढ़ने के साथ एक तेजी से धीमी क्वेरी का जोखिम है।

यदि आप जानते हैं कि आपका "आईडी" कॉलम एक ऑटो-वृद्धि प्राथमिक कुंजी (जो संभवतः है) है, तो बस इसका उपयोग करें क्योंकि यह परिभाषा के अनुसार एक सूचकांक है।

इसके अलावा, जब तक कि AREL को किसी खोज (: अंतिम) में केवल एक रिकॉर्ड का चयन करने के लिए अनुकूलित नहीं किया जाता है, तो आप इसे सभी रिकॉर्ड्स चुनने का जोखिम चलाते हैं, फिर आपको "अंतिम()" विधि का उपयोग कर अंतिम बार वापस कर देते हैं ।

MyModel.last(:order => "id asc", :limit => 1) 

या

MyModel.first(:order => "id desc", :limit => 1) 
+6

'@ पोस्ट = पोस्ट.ऑर्डर (" बनाया_at ")। आखिरी 'वास्तव में सही काम करता है।कंसोल आउटपुट 'SELECT "पोस्ट की तरह कुछ है"। * "पोस्ट" से "पोस्ट" द्वारा आदेश। "बनाया गया" DESC LIMIT 1' – PhilT

2

आप एक पर्याप्त उच्च यातायात मेज पर created_at का उपयोग कर अस्पष्टता में समस्याएं आ रही हो सकता है: अधिक कुशल एक के लिए परिणामों को सीमित करने के लिए है।

उदाहरण के लिए। प्रयास करें:

INSERT INTO table (created_at) VALUES (NOW()); 
INSERT INTO table (created_at) VALUES (NOW()); 

ही created_at, केवल संकल्प की 1 सेकंड है जो करने के लिए संभावित ..has। एक प्रकार उन्हें किसी विशेष क्रम में वापस नहीं करेगा।

आप माइक्रोक्रॉम मान को संग्रहीत करने और उस पर सॉर्ट करने से बेहतर हो सकते हैं।

संबंधित मुद्दे