rails joins includes ruby-on-rails named-scope

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.