2010-12-01 2 views

Répondre

4

Si vous ne devez rechercher les enregistrements par ID, vous pouvez essayer cette

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

Si l'un des ID n'existe pas la méthode find déclenche une exception ActiveRecord :: RecordNotFound que nous avons simplement prises et retourne vrai.

Excuse mon anglais :)

22

ajoutez juste un! opérateur

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

Je suis demander comment dire si "2" et "3" n'existent pas, comment le faire retourner faux. '! Model.exists? (: Id => [1, 2, 3])' renvoie 'false' si' 1' existe, alors que je veux 'Model.not_exists? (: Id => [1, 2, 3]) 'renvoyer true s'il n'en existe pas. –

+1

'Model.find (ids_ary) .count' puis' rescue ActiveRecord :: RecordNotFound' –

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

Explication: Si (et seulement si) tous les cas, vous êtes à la recherche d'exist, Model.where(id: ids).count est égal à ids.size. Toutefois, s'il manque une ou plusieurs instances, le nombre sera inférieur, ce qui signifie qu'il existe un enregistrement qui n'existe pas.

+2

Peut-être avec une explication c'est plus utile – R3tep

+0

Explication ajoutée. –

-1

Une autre méthode simple consiste à utiliser la méthode where avec un tableau d'ID.

# 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

Utilisez empty?, c'est ce que vous voulez. Il utilise count(*) par rapport à 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

Est-ce que 'SELECT 1 AS one ... LIMIT 1' n'est pas plus efficace que' SELECT COUNT (*) '? –

0

Une façon plus Ruby-esque de le faire serait d'utiliser unless avec exists?. De cette façon, vous n'avez pas besoin d'utiliser !. J'imagine votre cas d'utilisation est quelque chose comme ceci:

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

    # do something 
end 

Vous pouvez remplacer 1, 2, 3 avec une variable (appeler id ou quelque chose) et même supprimer le tableau tout à fait si vous souhaitez: .exists?(id: id)

Questions connexes