ruby on rails - inner - Anulación de default_scope en Rails
rails find (4)
Este fue de alguna manera dejado escondido :)
Solo use Post.unscoped.where(:deleted => true)
, si está usando Rails 3
El crédito es para José Valim por esto.
En mi modelo Post.rb, tengo default_scope :conditions => {:deleted => ''false''}
Pero si intento ejecutar Post.find(:all, :conditions => "deleted=''false''")
, no devolverá nada. Es como si el default_scope tiene prioridad sobre todo.
Lo quiero para que cuando haga Post.find()
no devuelva las publicaciones eliminadas, pero también me gustaría poder acceder a ellas si es necesario. ¿Qué se debe cambiar en mi consulta o en mi modelo de Rails?
Gracias.
Los alcances deben ser compositivos, lo que significa que puede combinar muchos de ellos y que efectivamente aplica todas las condiciones. En este caso, ActiveRecord es demasiado ingenuo para determinar que la condición explícita debería negar la primera. Simplemente construye la consulta uniendo todas las cláusulas con ANDs. Por esta razón, default_scope tiene la mayor utilidad con las cláusulas: order que no se pueden componer (en la implementación de ActiveRecord 2.3 de todos modos). Hay más discusión here .
También tenga en cuenta que en Rails 3 ActiveRecord está utilizando Arel para una gran cantidad de construcción de consultas, lo que aumentará en gran medida el poder de la generación de consultas de ActiveRecord a la vez que simplifica muchos de los aspectos internos. Es probable que con Arel mejore tu situación. Mientras tanto, recomiendo no poner condiciones en un default_scope a menos que haya filas que realmente desees que sean invisibles para tu aplicación Rails.
utilizar with_exclusive_scope
Post.with_exclusive_scope { Post.find(:all) }
with_exclusive_scope
está protected
, por lo que debe crear un método de clase:
def self.include_deleted_in
Event.with_exclusive_scope { yield }
end
entonces en tu llamada del controlador
Post.include_deleted_in { Post.find(:all) }