mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Model.scoped now returns a relation if invoked without any arguments
Example : posts = Post.scoped posts.size # Fires "select count(*) from posts" and returns the count posts.each {|p| puts p.name } # Fires "select * from posts" and loads post objects
This commit is contained in:
parent
7f5d44bac5
commit
2e79ec71a5
2 changed files with 25 additions and 11 deletions
|
@ -6,18 +6,26 @@ module ActiveRecord
|
|||
module NamedScope
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
# All subclasses of ActiveRecord::Base have one named scope:
|
||||
# * <tt>scoped</tt> - which allows for the creation of anonymous \scopes, on the fly: <tt>Shirt.scoped(:conditions => {:color => 'red'}).scoped(:include => :washing_instructions)</tt>
|
||||
#
|
||||
# These anonymous \scopes tend to be useful when procedurally generating complex queries, where passing
|
||||
# intermediate values (scopes) around as first-class objects is convenient.
|
||||
#
|
||||
# You can define a scope that applies to all finders using ActiveRecord::Base.default_scope.
|
||||
included do
|
||||
named_scope :scoped, lambda { |scope| scope }
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
# Returns a relation if invoked without any arguments.
|
||||
#
|
||||
# posts = Post.scoped
|
||||
# posts.size # Fires "select count(*) from posts" and returns the count
|
||||
# posts.each {|p| puts p.name } # Fires "select * from posts" and loads post objects
|
||||
#
|
||||
# Returns an anonymous named scope if any options are supplied.
|
||||
#
|
||||
# shirts = Shirt.scoped(:conditions => {:color => 'red'})
|
||||
# shirts = shirts.scoped(:include => :washing_instructions)
|
||||
#
|
||||
# Anonymous \scopes tend to be useful when procedurally generating complex queries, where passing
|
||||
# intermediate values (scopes) around as first-class objects is convenient.
|
||||
#
|
||||
# You can define a scope that applies to all finders using ActiveRecord::Base.default_scope.
|
||||
def scoped(options = {}, &block)
|
||||
options.present? ? Scope.new(self, options, &block) : arel_table
|
||||
end
|
||||
|
||||
def scopes
|
||||
read_inheritable_attribute(:scopes) || write_inheritable_attribute(:scopes, {})
|
||||
end
|
||||
|
|
|
@ -12,6 +12,12 @@ require 'models/company'
|
|||
class RelationTest < ActiveRecord::TestCase
|
||||
fixtures :authors, :topics, :entrants, :developers, :companies, :developers_projects, :accounts, :categories, :categorizations, :posts, :comments
|
||||
|
||||
def test_scoped
|
||||
topics = Topic.scoped
|
||||
assert_kind_of ActiveRecord::Relation, topics
|
||||
assert_equal 4, topics.size
|
||||
end
|
||||
|
||||
def test_finding_with_conditions
|
||||
assert_equal Author.find(:all, :conditions => "name = 'David'"), Author.all.conditions("name = 'David'").to_a
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue