Flowdock
with_scope(method_scoping = {}, action = :merge, &block) protected

with_scope lets you apply options to inner block incrementally. It takes a hash and the keys must be :find or :create. :find parameter is Relation while :create parameters are an attributes hash.

  class Article < ActiveRecord::Base
    def self.create_with_scope
      with_scope(:find => where(:blog_id => 1), :create => { :blog_id => 1 }) do
        find(1) # => SELECT * from articles WHERE blog_id = 1 AND id = 1
        a = create(1)
        a.blog_id # => 1
      end
    end
  end

In nested scopings, all previous parameters are overwritten by the innermost rule, with the exception of where, includes, and joins operations in Relation, which are merged.

joins operations are uniqued so multiple scopes can join in the same table without table aliasing problems. If you need to join multiple tables, but still want one of the tables to be uniqued, use the array of strings format for your joins.

  class Article < ActiveRecord::Base
    def self.find_with_scope
      with_scope(:find => where(:blog_id => 1).limit(1), :create => { :blog_id => 1 }) do
        with_scope(:find => limit(10)) do
          all # => SELECT * from articles WHERE blog_id = 1 LIMIT 10
        end
        with_scope(:find => where(:author_id => 3)) do
          all # => SELECT * from articles WHERE blog_id = 1 AND author_id = 3 LIMIT 1
        end
      end
    end
  end

You can ignore any previous scopings by using the with_exclusive_scope method.

  class Article < ActiveRecord::Base
    def self.find_with_exclusive_scope
      with_scope(:find => where(:blog_id => 1).limit(1)) do
        with_exclusive_scope(:find => limit(10)) do
          all # => SELECT * from articles LIMIT 10
        end
      end
    end
  end

Note: the :find scope also has effect on update and deletion methods, like update_all and delete_all.

Show source
Register or log in to add new notes.
January 14, 2010
0 thanks

:find takes more keys than written

The documentation says that the :find keywords “may include the :conditions, :joins, :include, :offset, :limit, and :readonly options”. Note that this does not mean that only those options are supported. :sort also works like it should, for example.