Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kanety/activerecord_nested_scope
An ActiveRecord extension to build nested scopes through pre-defined associations
https://github.com/kanety/activerecord_nested_scope
Last synced: 2 months ago
JSON representation
An ActiveRecord extension to build nested scopes through pre-defined associations
- Host: GitHub
- URL: https://github.com/kanety/activerecord_nested_scope
- Owner: kanety
- License: mit
- Created: 2017-11-23T11:03:33.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2024-10-21T00:43:03.000Z (3 months ago)
- Last Synced: 2024-10-21T04:07:06.375Z (3 months ago)
- Language: Ruby
- Homepage:
- Size: 67.4 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# ActiveRecordNestedScope
An ActiveRecord extension to build nested scopes through pre-defined associations.
## Dependencies
* ruby 2.4+
* activerecord 5.0+
* activesupport 5.0+## Installation
Add this line to your application's Gemfile:
```ruby
gem 'activerecord_nested_scope'
```Then execute:
$ bundle
## Usage
For example, define `in_group` scope using nested_scope as follows:
```ruby
class Group < ActiveRecord::Base
nested_scope :in_group # root scope
...
endclass User < ActiveRecord::Base
belongs_to :group
nested_scope :in_group, through: :group # User belongs to Group
...
endclass UserConfig < ActiveRecord::Base
belongs_to :user
nested_scope :in_group, through: :user # UserConfig belongs to Group through User
...
end
````in_group` scope generates SQL as follows:
```ruby
User.in_group(id: 1)
#=> SELECT "users".* FROM "users" WHERE "users"."group_id" IN (
# SELECT "groups"."id" FROM "groups" WHERE "groups"."id" = 1)UserConfig.in_group(id: 1)
#=> SELECT "user_configs".* FROM "user_configs" WHERE "user_configs"."user_id" IN (
# SELECT "users"."id" FROM "users" WHERE "users"."group_id" IN (
# SELECT "groups"."id" FROM "groups" WHERE "groups"."id" = 1))
```### Polymorphic association
If you define a polymorphic association,
`in_group` generates union of subqueries for each polymorpchic type as follows:```ruby
class Polymorphism < ActiveRecord::Base
belongs_to :record, polymorphic: true
nested_scope :in_group, through: :record
endPolymorphism.in_group(id: 1)
#=> SELECT "polymorphisms"."record_type" FROM "polymorphisms" GROUP BY "polymorphisms"."record_type"
#=> SELECT "polymorphisms".* FROM (
# SELECT "polymorphisms".* FROM "polymorphisms" WHERE "polymorphisms"."record_type" = 'Group' AND "polymorphisms"."record_id" IN (SELECT "groups"."id" FROM "groups" WHERE "groups"."id" = 1) UNION
# SELECT "polymorphisms".* FROM "polymorphisms" WHERE "polymorphisms"."record_type" = 'User' AND "polymorphisms"."record_id" IN (SELECT "users"."id" FROM "users" WHERE "users"."group_id" IN (SELECT "groups"."id" FROM "groups" WHERE "groups"."id" = 1)) UNION
# SELECT "polymorphisms".* FROM "polymorphisms" WHERE "polymorphisms"."record_type" = 'UserConfig' AND "polymorphisms"."record_id" IN (SELECT "user_configs"."id" FROM "user_configs" WHERE "user_configs"."user_id" IN (SELECT "users"."id" FROM "users" WHERE "users"."group_id" IN (SELECT "groups"."id" FROM "groups" WHERE "groups"."id" = 1)))
# ) AS polymorphisms
```Note that the first SQL is executed to load `record_type`,
and the second SQL is built using loaded `record_type` variations.### Scope arguments
```ruby
# pass a integer
User.in_group(1)# pass an array
User.in_group([1, 2, 3])# pass a hash
User.in_group(id: 1)# pass an AR relation
User.in_group(Group.where(id: 1))
```## Contributing
Bug reports and pull requests are welcome at https://github.com/kanety/activerecord_nested_scope.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).