2010-12-01 7 views
11

मैं अगर एक रिकार्ड (रों) मौजूद है की जाँच करने के ऐसा कर सकते हैं (जैसे कि आईडी "1" मौजूद है, लेकिन "2" और "3" नहीं है):जांचें कि रेल में रिकॉर्ड मौजूद नहीं है (आईडी के सरणी से)?

Model.exists?(:id => [1, 2, 3]) #=> true 

मैं विपरीत करना कैसे करते हैं, इसलिए:

Model.not_exists?(:id => [1, 2, 3]) #=> true 

उत्तर

4

आप केवल आईडी माध्यम से खोज रिकॉर्ड आप इस

class Model 
    def self.not_exists?(ids) 
    self.find(ids) 
    false 
    rescue 
    true 
    end 
end 

कोशिश कर सकते हैं आईडी के किसी भी find विधि मौजूद नहीं है एक ActiveRecord :: RecordNotFound अपवाद बढ़ा देंगे की जरूरत है कि हम बस पकड़ और सच वापसी।

बहाना मेरी अंग्रेजी :)

22

बस एक जोड़ें! ऑपरेटर

!Model.exists?(:id => [1, 2, 3]) #=> true 
+2

मैं यह पूछने के लिए कि क्या '2' और' 3' मौजूद नहीं है, यह कैसे झूठी वापसी करने के लिए है। 'मॉडल.एक्सिस्ट्स? (: Id => [1, 2, 3])' ''' मौजूद है, तो '''' मौजूद है, जबकि मैं' model.not_exists चाहता हूं? (: Id => [1, 2, 3]) यदि कोई अस्तित्व में नहीं है तो सत्य वापस लौटना। –

+1

'Model.find (ids_ary) .count' फिर 'बचाव ActiveRecord :: RecordNotFound' –

1
class Model 
    def self.does_not_exist?(ids) 
    Model.where(id: ids).count < ids.size 
    end 
end 

स्पष्टीकरण: (और केवल यदि) सभी उदाहरणों आप अस्तित्व के लिए देख रहे हैं, Model.where(id: ids).countids.size के बराबर है।

हालांकि यदि एक या अधिक उदाहरण गायब हैं, तो गणना कम होगी, जिसका अर्थ है कि एक रिकॉर्ड मौजूद नहीं है।

+2

शायद एक स्पष्टीकरण के साथ यह अधिक उपयोगी – R3tep

+0

स्पष्टीकरण जोड़ा गया है। –

-1

आईडी का सरणी के साथ कहां विधि का उपयोग करना एक और आसान तरीका है।

# If the count of the query is equal to the count of all of the id's then the statement will return false. 
# Else it will return true if not all ids exists in the database. 
Model.where(id: [1, 2, 3]).count < [1,2,3].count 
1

empty? का उपयोग करें, यह वही है जो आप चाहते हैं। यह count(*) बनाम select 1 as one का उपयोग करता है।

> Rocketeer.where(:id => [1, 2, 3]).empty? 
    (0.6ms) SELECT COUNT(*) FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) 
=> false 

> Rocketeer.where(:id => [1, 2, 3]).any? 
    (0.5ms) SELECT COUNT(*) FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) 
=> true 

> Rocketeer.where(:id => [1, 2, 3]).exists? 
    Rocketeer Exists (0.5ms) SELECT 1 AS one FROM "rocketeers" WHERE "rocketeers"."id" IN (1, 2, 3) LIMIT 1 
=> true 
+5

'चयन 1 के रूप में नहीं है ...' SELECT COUNT (*) 'से LIMIT 1' अधिक कुशल है? –

0

कर यह exists? साथ unless उपयोग करने के लिए किया जाएगा का एक और अधिक रूबी-esque तरह से। इस तरह, आपको ! का उपयोग करने की आवश्यकता नहीं है। मुझे लगता है आपके उपयोग के मामले कुछ इस तरह है: यदि आप चाहें तो एक चर (इसे कहते id या कुछ और) और यहां तक ​​कि सरणी पूरी तरह निकाल दें साथ

def my_method 
    return unless Model.exists?(:id => [1, 2, 3]) 

    # do something 
end 

आप की जगह ले सकता 1, 2, 3: .exists?(id: id)

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