PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रेल 4:पोस्टग्रेएसक्यूएल फ़ंक्शन का उपयोग क्रम में शामिल तालिका में शामिल नहीं होने के कारण क्वेरी में त्रुटि का कारण बनता है

मान लीजिए आपको पहले पांच पोस्ट का उपयोगकर्ता नाम प्राप्त करने की आवश्यकता है। आप जल्दी से नीचे प्रश्न लिखें और अपने सप्ताहांत का आनंद लें।

posts = Post.limit(5)

posts.each do |post|
  puts post.user.name
end

अच्छा। लेकिन आइए प्रश्नों को देखें

Post Load (0.5ms)  SELECT  `posts`.* FROM `posts` LIMIT 5
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 1 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 1 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 2 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 2 LIMIT 1
User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE  `users`.`id` = 1 LIMIT 1

1 query सभी posts लाने के लिए और 1 query users प्रत्येक पोस्ट के परिणाम कुल 6 queries . में होते हैं . नीचे दिए गए समाधान की जाँच करें जो वही काम करता है, बस 2 queries . में :

posts = Post.includes(:user).limit(5)

posts.each do |post|
  puts post.user.name
end

#####

Post Load (0.3ms)  SELECT  `posts`.* FROM `posts` LIMIT 5
User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2)

एक छोटा सा अंतर है। जोड़ें includes(:posts) आपकी क्वेरी के लिए, और समस्या हल हो गई। तेज़, अच्छा और आसान।

लेकिन न केवल includes आपकी क्वेरी में इसे ठीक से समझे बिना। includes . का उपयोग करना joins . के साथ स्थिति के आधार पर क्रॉस-जॉइन हो सकता है, और ज्यादातर मामलों में आपको इसकी आवश्यकता नहीं होती है।

यदि आप अपने शामिल मॉडलों में शर्तें जोड़ना चाहते हैं तो आपको उनका स्पष्ट रूप से संदर्भ देना होगा . उदाहरण के लिए:

User.includes(:posts).where('posts.name = ?', 'example')

एक त्रुटि देगा, लेकिन यह काम करेगा:

User.includes(:posts).where('posts.name = ?', 'example').references(:posts)

ध्यान दें कि includes association names के साथ काम करता है जबकि references the actual table name की आवश्यकता है ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीजी व्यवस्थापक से https://api.elephantsql.com से कनेक्ट नहीं हो सकता

  2. ट्रिगर को सक्रिय करने वाली क्वेरी की स्ट्रिंग प्राप्त करें

  3. क्या साइड इफेक्ट के साथ कार्यों को लागू करते समय संघ निष्पादन के आदेश की गारंटी देता है?

  4. पोस्टग्रेज़ को पता नहीं है कि सर्वर कॉन्फ़िगरेशन फ़ाइल कहाँ मिलेगी

  5. गैर-असीसी वर्णों की जांच करने के लिए Postgresql बाधा