rails inner includes ruby-on-rails models default-scope

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.



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) }