दिलचस्प पोस्ट
PostgreSQL में थोक / बैच अपडेट / अपस्टैट कैसे WPF विकास शुरू करने के लिए? Java8 धाराओं में प्रसंस्करण के आदेश को सुनिश्चित करने के लिए कैसे? प्रत्येक 'लूप' काम के लिए जावा कैसे करता है? क्यों वेक्टर <bool> :: संदर्भ bool का संदर्भ नहीं लौटाता है? माइक्रोसॉफ्ट। विज़ुअल स्टूडियो पैकेज ठीक से लोड नहीं हुआ जावास्क्रिप्ट तत्व के बाद बच्चे संलग्न करें डिफ अल्गोरिदम (PHP) सत्र कुकी को सही तरीके से कैसे नष्ट कर सकता है? एक और अज्ञात CacheManager पहले से ही एक ही VM (ehCache 2.5) में मौजूद है ट्विटर एप्लिकेशन के लिए एंड्रॉइड इन्टेंट जावा त्रुटि: केवल एक प्रकार का आयात किया जा सकता है XYZ एक पैकेज को हल करता है पीजी (0.17.1) स्थापित करते समय त्रुटि हुई, और बंडलर जारी नहीं हो सकता जावा का उपयोग करने वाले विंडोज कमांड को कैसे निष्पादित करें – नेटवर्क सेटिंग्स बदलें PHP में एक एक्सेल फाइल पढ़ना

ActiveRecord / Rails के साथ क्वेरी में नहीं व्यक्त करने के लिए कैसे?

बस इसे अपडेट करने के लिए क्योंकि ऐसा लगता है कि बहुत सारे लोग इस पर आते हैं, अगर आप रेल 4 का उपयोग कर रहे हैं, तो ट्रंक लैक्स और विनीविदिविक के जवाब देखें।

Topic.where.not(forum_id:@forums.map(&:id)) Topic.where(published:true).where.not(forum_id:@forums.map(&:id)) 

मुझे उम्मीद है कि एक आसान समाधान है जिसमें find_by_sql शामिल नहीं है, अगर नहीं तो मुझे लगता है कि काम करना होगा।

मुझे यह आलेख मिल गया है जो इसका संदर्भ देता है:

 Topic.find(:all, :conditions => { :forum_id => @forums.map(&:id) }) 

जो समान है

 SELECT * FROM topics WHERE forum_id IN (<@forum ids>) 

मैं सोच रहा हूं कि ऐसा करने का कोई तरीका NOT IN है, जैसे:

 SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>) 

Solutions Collecting From Web of "ActiveRecord / Rails के साथ क्वेरी में नहीं व्यक्त करने के लिए कैसे?"

मैं इसका उपयोग कर रहा हूं:

 Topic.where('id NOT IN (?)',actions) 

जहां actions का एक सरणी है: [1,2,3,4,5]

संपादित करें:

रेल 4 नोटेशन के लिए:

 Article.where.not(title: ['Rails 3', 'Rails 5']) 

एफवाईआई, रेल 4 में, आप सिंटैक्स का उपयोग not कर सकते हैं:

 Article.where.not(title: ['Rails 3', 'Rails 5']) 

आप ऐसा कुछ करने की कोशिश कर सकते हैं:

 Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.map(&:id)]) 

आपको @forums.map(&:id).join(',') करने की आवश्यकता हो सकती है। @forums.map(&:id).join(',') । मुझे नहीं याद आ रहा है कि क्या रेल एक सीएसवी सूची में तर्क होगा यदि यह गणना योग्य है

आप यह भी कर सकते हैं:

 # in topic.rb named_scope :not_in_forums, lambda { |forums| { :conditions => ['forum_id not in (?)', forums.select(&:id).join(',')] } # in your controller Topic.not_in_forums(@forums) 

Arel का उपयोग करना:

 topics=Topic.arel_table Topic.where(topics[:forum_id].not_in(@forum_ids)) 

या, अगर पसंदीदा:

 topics=Topic.arel_table Topic.where(topics[:forum_id].in(@forum_ids).not) 

और के बाद से रेल 4 पर:

 topics=Topic.arel_table Topic.where.not(topics[:forum_id].in(@forum_ids)) 

कृपया ध्यान दें कि अंततः आप फ़ोरम_आईडी को आईआईडी सूची नहीं मानना ​​चाहते हैं, बल्कि एक सबक्यूरी, यदि ऐसा है तो आपको विषयों से पहले ऐसा कुछ करना चाहिए:

 @forum_ids = Forum.where(/*whatever conditions are desirable*/).select(:id) 

इस तरह आप एक ही क्वेरी में सब कुछ पाएं: कुछ ऐसा:

 select * from topic where forum_id in (select id from forum where /*whatever conditions are desirable*/) 

यह भी ध्यान रखें कि अंततः आप ऐसा नहीं करना चाहते, बल्कि एक शामिल होने – जो अधिक कुशल हो सकता है

@ Trung Lê के जवाब पर विस्तार करने के लिए, रेल 4 में आप निम्न कर सकते हैं:

 Topic.where.not(forum_id:@forums.map(&:id)) 

और आप इसे एक कदम आगे ले जा सकते हैं यदि आपको पहले ही प्रकाशित विषयों के लिए पहले फ़िल्टर करने की आवश्यकता है और फिर आप जो आईडी नहीं चाहते हैं, तो उसे फ़िल्टर कर सकते हैं, आप यह कर सकते हैं:

 Topic.where(published:true).where.not(forum_id:@forums.map(&:id)) 

रेल 4 इतना आसान बना देता है!

स्वीकार किए जाते हैं समाधान विफल रहता है यदि @forums रिक्त है इसका समाधान करने के लिए मुझे करना था

 Topic.find(:all, :conditions => ['forum_id not in (?)', (@forums.empty? ? '' : @forums.map(&:id))]) 

या, अगर रेल 3+ का उपयोग कर रहे हैं:

 Topic.where( 'forum_id not in (?)', (@forums.empty? ? '' : @forums.map(&:id)) ).all 

ऊपर दिए गए अधिकांश उत्तर आपको पर्याप्त होंगे लेकिन यदि आप बहुत अधिक ऐसे विधेय और जटिल संयोजन कर रहे हैं, तो जांचें आप ऐसा कुछ करने में सक्षम होंगे:

 Topic.where{{forum_id.not_in => @forums.map(&:id)}} Topic.where{forum_id.not_in @forums.map(&:id)} Topic.where{forum_id << @forums.map(&:id)} 

आप एरनी मिलर द्वारा मेटा_यहाँ प्लगइन पर एक नज़र रखना चाहते हैं। आपका एसक्यूएल कथन:

 SELECT * FROM topics WHERE forum_id NOT IN (<@forum ids>) 

… इस तरह व्यक्त किया जा सकता है:

 Topic.where(:forum_id.nin => @forum_ids) 

रेलसेकास्ट्स के रयान बैट्स ने एक अच्छा स्क्रीनकास्ट बनाया जो मेटा वॉरेर समझा रहा था ।

सुनिश्चित नहीं हैं कि यह वही है जो आप चाहते हैं, लेकिन मेरी आंखों पर यह निश्चित रूप से एक एम्बेडेड एसक्यूएल क्वेरी से बेहतर दिखता है।

क्या ये मंच आईडी एक व्यावहारिक तरीके से काम किया जा सकता है? उदाहरण के लिए, आप इन मंचों को किसी तरह ढूँढ सकते हैं – यदि ऐसा है तो आपको कुछ करना चाहिए

 Topic.all(:joins => "left join forums on (forums.id = topics.forum_id and some_condition)", :conditions => "forums.id is null") 

कौन सा एक एसक्यूएल not in से अधिक कुशल होगा

इस तरह से पठनीयता के अनुकूल हो जाता है, लेकिन डेटाबेस प्रश्नों के संदर्भ में यह उतना कुशल नहीं है:

 # Retrieve all topics, then use array subtraction to # find the ones not in our list Topic.all - @forums.map(&:id) 

मूल पोस्ट विशेष रूप से संख्यात्मक आईडी का उपयोग करने के लिए उल्लेख किया गया है, लेकिन मैं यहाँ स्ट्रिंग्स की एक सरणी के साथ नहीं करने के लिए सिंटैक्स की तलाश में आया हूं।

ActiveRecord आपके लिए भी अच्छी तरह से संभाल लेंगे:

 Thing.where(['state NOT IN (?)', %w{state1 state2}]) 

आप अपनी परिस्थितियों में एसक्यूएल का उपयोग कर सकते हैं:

 Topic.find(:all, :conditions => [ "forum_id NOT IN (?)", @forums.map(&:id)]) 

जॉनी की पिंगबैकिंग बंद:

 Topic.find(:all, :conditions => ['forum_id not in (?)', @forums.pluck(:id)]) 

तत्वों पर मैपिंग के बजाय चाप का उपयोग करना

railsconf 2012 2012 10 चीजों के माध्यम से पाया गया जो आपको नहीं पता था कि रेल क्या कर सकता था

जब आप किसी रिक्त सरणी को क्वेरी करते हैं, तो उस ब्लॉक में सरणी के लिए "<< 0" जोड़ते हैं, जिससे वह "नल" वापस नहीं लौटाता और क्वेरी को तोड़ता है।

 Topic.where('id not in (?)',actions << 0) 

यदि क्रियाएं रिक्त या रिक्त एरे हो सकती हैं

यहाँ एक अधिक जटिल "नहीं है" क्वेरी है, जिसमें 4 शक्ल में एक subquery का उपयोग कर squeel का उपयोग कर। बेशक समकक्ष एसक्यूएल की तुलना में बहुत धीमी है, लेकिन हे, यह काम करता है।

  scope :translations_not_in_english, ->(calmapp_version_id, language_iso_code){ join_to_cavs_tls_arr(calmapp_version_id). joins_to_tl_arr. where{ tl1.iso_code == 'en' }. where{ cavtl1.calmapp_version_id == my{calmapp_version_id}}. where{ dot_key_code << (Translation. join_to_cavs_tls_arr(calmapp_version_id). joins_to_tl_arr. where{ tl1.iso_code == my{language_iso_code} }. select{ "dot_key_code" }.all)} } 

दायरे में पहले 2 विधियां अन्य स्कोप हैं जो उपनाम cavtl1 और tl1 घोषित करते हैं। << ऑपरेटर में दबाने में नहीं है

उम्मीद है कि यह किसी को मदद करता है