arrow_backward Back to blog

with_scope is protected

I’ve seen a lot of people run into trouble using with_scope on edge.

The solution? Don’t use it or use it sparingly. They made it protected for a reason – to protect people from abusing it – but if you absolutely must have at it then you can do something like this:


   klass.send(:with_scope, :find => { :conditions => conditions }) { yield }

So say you want to scope your finders to retrieve only MyModel objects of type ‘super’:


  def my_super_duper_scoping(klass)    klass.send(:with_scope, :find => { :conditions => "type = 'super'" }) { yield }  end    my_super_models = my_super_duper_scoping(MyModel) do      MyModel.find(:all)    end    my_super_models_named_david = my_super_duper_scoping(MyModel) do      MyModel.find(:all, :conditions => ["name = '?'", 'david')    end

Using self.class.send is a way to get around public and private checking in ruby 1.8. Use with caution.


New Project Request