2010-12-01 14 views

cevap

4

sadece kimlikleri herhangi bir ActiveRecord :: RecordNotFound istisna yükseltecektir find yöntemi yoksa bu

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

deneyebilirsiniz ID yoluyla kayıtları arama gerekiyorsa o biz sadece yakalamak ve gerçek geri dönüş.

Mazeret İngilizcem :)

22

Sadece ekleyin a! Operatör

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

ben Kullanım durumunuz böyle bir şey hayal “2” ve “3” yoksa nasıl söyleyeceğinizi sormak, yanlış nasıl geri dönersiniz. '' Model.exists? (: Id => [1, 2, 3]) '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '(' id => [1, 2, 3]) '' 'false' 'i döndürür,' 'Model.not_exists' 'isterken (: id => [1, 2, 3]) Varsa, eğer doğru değilse geri dönün. –

+1

'Model.find (ids_ary) .count' sonra' ActiveRecord :: RecordNotFound'u kurtarma –

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

Açıklama: tüm örnekleri (ve ancak) sen varoldukları için arıyorsanız, Model.where(id: ids).countids.size eşittir.

Bununla birlikte, bir veya daha fazla örnek eksikse, sayım daha düşük olacaktır, yani mevcut olmayan bir kayıt vardır.

+2

Belki bir açıklama ile daha yararlıdır – R3tep

+0

Açıklama eklendi. –

-1

Başka bir basit yöntem, bir dizi kimlikle yöntemini kullanmaktır.

# 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? kullanın, istediğiniz gibi budur. count(*) vs select 1 as one kullanır.

> 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

"SELECT 1 AS one ... LIMIT 1" SELECT COUNT (*) 'yerine daha etkili değil mi? –

0

o exists? ile unless kullanmak olacaktır yapmanın daha Yakut-vari bir yol. Bu şekilde, !'u kullanmanız gerekmez.

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

    # do something 
end 

Sen yerini alabilir 1, 2, 3 bir değişken (id falan diyoruz) ve hatta tamamen diziyi kaldırmak ile isterseniz: Ben .exists?(id: id)

İlgili konular