ruby-on-rails - joins - rails where
Alcance vacĂo con Ruby sobre rieles (7)
Problema siguiente:
Necesito algo como un visor vacío. Lo que significa que este alcance es vacío, pero responde a todos los métodos a los que responde normalmente un alcance. Actualmente estoy usando un pequeño truco sucio. Simplemente proporciono "1 = 0" como condiciones. Encuentro esto realmente feo, ya que llega a la base de datos. Simplemente devolver una matriz vacía no funcionará, ya que el resultado debe responder a los métodos de alcance.
¿Existe una solución mejor para esto o necesitaré codificar esto yo mismo?
Tal vez algún código de ejemplo podría ayudar a explicar lo que necesito:
class User < ActiveRecord::Base
named_scope :admins, :conditions => {:admin => true }
named_scope :none_dirty, :conditions => "1=0" # this scope is always empty
def none_broken
[]
end
def self.sum_score # okay, a bit simple, but a method like this should work!
total = 0
self.all.each do |user|
total += user.score
end
return total
end
end
User.admin.sum_score # the score i want to know
User.none_drity.sum_score # works, but hits the db
User.none_broken.sum_score # ...error, since it doesn''t respond to sum_score
¿Qué hay de User.where(id: nil)
?
O User.where(_id: nil)
para mongoid.
Creo que necesitas User.scoped({})
Lo que buscas no existe. Puedes implementar algo como esto parcheando el método de find
. Sin embargo, esto sería una exageración, por lo que recomiendo mantener esto a menos que sea crítico para el rendimiento.
Lo sentimos User.scoped
no es lo que quieres. Como comentamos esto lo devuelve todo. Debería haber prestado más atención a la pregunta.
He visto where(''1 = 0'')
sugirió antes y Rails probablemente también debería almacenarlo en caché.
Además, where(''1 = 0'')
no llegará a la base de datos hasta que hagas .each
, .each
o uno de los métodos de cálculo.
Rieles 4 introduce el ámbito de none
.
Se debe utilizar en los casos en que tenga un método que devuelva una relación, pero existe una condición en la que no desea que se consulte la base de datos.
Si desea que un ámbito devuelva un ámbito inalterado, utilice all
:
Una llamada a Model.all
ejecutará una consulta inmediatamente y devolverá una matriz de registros. En Rails 4, las llamadas a Model.all
son equivalentes al Model.scoped
ahora en desuso. Esto significa que se pueden encadenar más relaciones a Model.all
y que el resultado se evaluará perezosamente.
Ver el código de ejemplo indica que es posible que no sepa acerca de las consultas agregadas en SQL que se exponen como métodos de cálculo en Rails:
User.sum(:score)
le dará la suma de las puntuaciones de todos los usuarios
Echa un vistazo a Rails Guides para más información:
http://guides.rubyonrails.org/active_record_querying.html#sum
User.where(''false'')
devuelve un ActiveRecord :: Relation con cero elementos, que es un ámbito capaz de encadenar que no llegará a la base de datos hasta que realmente intente acceder a uno de sus elementos. Esto es similar a la solución de PhilT con (''1 = 0'') pero un poco más elegante.