In Active Record Querying guide, currently Merging of scopes section uses a concept of default scope in its example before it is introduced in the following section titled Applying a default scope.

It makes more sense to switch the ordering to introduce default scopes (`Applying a default scope`) first and then go into `Merging of scopes` section where it is used.
This commit is contained in:
ariabov 2014-04-02 23:39:22 -07:00
parent 79f06a9134
commit 34a3d425ea
2 changed files with 33 additions and 30 deletions

@ -1 +1,5 @@
* Switched the order of `Applying a default scope` and `Merging of scopes` subsections so default scopes are introduced first.
*Alex Riabov*
Please check [4-1-stable](https://github.com/rails/rails/blob/4-1-stable/guides/CHANGELOG.md) for previous changes.

@ -1231,6 +1231,35 @@ Using a class method is the preferred way to accept arguments for scopes. These
category.posts.created_before(time)
```
### Applying a default scope
If we wish for a scope to be applied across all queries to the model we can use the
`default_scope` method within the model itself.
```ruby
class Client < ActiveRecord::Base
default_scope { where("removed_at IS NULL") }
end
```
When queries are executed on this model, the SQL query will now look something like
this:
```sql
SELECT * FROM clients WHERE removed_at IS NULL
```
If you need to do more complex things with a default scope, you can alternatively
define it as a class method:
```ruby
class Client < ActiveRecord::Base
def self.default_scope
# Should return an ActiveRecord::Relation.
end
end
```
### Merging of scopes
Just like `where` clauses scopes are merged using `AND` conditions.
@ -1284,36 +1313,6 @@ User.where(state: 'inactive')
As you can see above the `default_scope` is being merged in both
`scope` and `where` conditions.
### Applying a default scope
If we wish for a scope to be applied across all queries to the model we can use the
`default_scope` method within the model itself.
```ruby
class Client < ActiveRecord::Base
default_scope { where("removed_at IS NULL") }
end
```
When queries are executed on this model, the SQL query will now look something like
this:
```sql
SELECT * FROM clients WHERE removed_at IS NULL
```
If you need to do more complex things with a default scope, you can alternatively
define it as a class method:
```ruby
class Client < ActiveRecord::Base
def self.default_scope
# Should return an ActiveRecord::Relation.
end
end
```
### Removing All Scoping
If we wish to remove scoping for any reason we can use the `unscoped` method. This is