2010-12-01 17 views

Respuesta

4

Si sólo necesita buscar en los registros a través de ID puede probar esta

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

Si cualquiera de los ID no existe el método find provocará una excepción ActiveRecord :: RecordNotFound que simplemente captura y regreso verdadero.

excusa mi Inglés :)

22

¡Simplemente agrega un! operador

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

estoy preguntando cómo decir si '2' y' 3' no existen, cómo hacer que devuelva falso. '! Model.exists? (: Id => [1, 2, 3])' devuelve 'false' si' 1' existe, mientras que '' Model.not_exists? (: Id => [1, 2, 3]) 'para devolver verdadero si alguno no existe. –

+1

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

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

Explicación: Si (y sólo si) todos los casos que busca existir, Model.where(id: ids).count es igual a ids.size.

Sin embargo, si faltan una o más instancias, el recuento será menor, lo que significa que hay un registro que no existe.

+2

Quizás con una explicación sea más útil – R3tep

+0

Explicación agregada. –

-1

Otra forma simple es usar el método where con una matriz de 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

Uso empty?, esto es lo que desea. Utiliza count(*) contra 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

¿No es 'SELECT 1 AS one ... LIMIT 1' más eficiente que' SELECT COUNT (*) '? –

0

Una forma más Rubí-esque de hacerlo sería utilizar unless con exists?. De esta forma, no tiene que usar !. Imagino su caso de uso es algo como esto:

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

    # do something 
end 

Puede reemplazar 1, 2, 3 con una variable (llámese id o algo así) e incluso quitar la matriz por completo si desea: .exists?(id: id)

Cuestiones relacionadas