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



Answers

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

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

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

Question

Si tengo un ámbito con una lambda y se necesita un argumento, dependiendo del valor del argumento, puedo saber que no habrá ninguna coincidencia, 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", el opuesto de "todos", que devuelve una relación que todavía puede estar encadenada, pero que da como resultado el cortocircuito de la consulta.




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

scope :none, limit(0)

Llevando a algo como esto:

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



Viniendo en Rails 4

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

Ni él ni los métodos encadenados generarán consultas en la base de datos.

De acuerdo con los comentarios:

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

Ver el código fuente




También hay variantes, pero todas estas están pidiendo a DB

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





Links