ruby-on-rails - ¿Cómo devolver una relación vacía de ActiveRecord?



4 Answers

Una solución más portátil que no requiere una columna "id" y no asume que no habrá una fila con una id de 0:

scope :none, where("1 = 0")

Todavía estoy buscando una forma más "correcta".

ruby-on-rails activerecord relation

Si tengo un ámbito con un lambda y toma un argumento, dependiendo del valor del argumento, puedo saber que no habrá coincidencias, pero aún quiero devolver una relación, no una matriz vacía:

scope :for_users, lambda { |users| users.any? ? where("user_id IN (?)", users.map(&:id).join(',')) : [] }

Lo que realmente quiero es un método "ninguno", lo opuesto a "todos", que devuelve una relación que aún puede ser encadenada, pero que resulta en una consulta cortocircuitada.




Viniendo en rieles 4

En Rails 4, se devolverá un ActiveRecord::NullRelation de llamadas como Post.none .

Ni esto, ni los métodos encadenados, generarán consultas a la base de datos.

Según los comentarios:

El ActiveRecord :: NullRelation devuelto se hereda de la relación e implementa el patrón de objeto nulo. Es un objeto con un comportamiento nulo definido y siempre devuelve una matriz de registros vacía sin consultar la base de datos.

Consulte el código fuente .




Creo que prefiero la forma en que se ve a las otras opciones:

scope :none, limit(0)

Conduciendo a algo como esto:

scope :users, lambda { |ids| ids.present? ? where("user_id IN (?)", ids) : limit(0) }



También hay variantes, pero todas estas están solicitando db

where('false')
where('null')



Related