π»π³ Note: HoΓ ng Sa and TrΖ°α»ng Sa belong to Viα»t Nam.
A simple collection of reusable Rails concerns to keep your models clean and DRY.
- β
Sluggable
: Generate friendly slugs from a specified field - π’
Sortable
: Sort records based on a field usingacts_as_list
, with flexible sorting field and direction - π€
Publishable
: Easily manage published/unpublished records using a simplepublished_at
field - β
SoftDeletable
: Soft delete records using a configurable timestamp field (e.g.,deleted_at
) with automatic scoping
Add this line to your application's Gemfile:
gem 'concerns_on_rails', github: 'VSN2015/concerns_on_rails'
Then execute:
bundle install
Add slugs based on a specified attribute.
class Post < ApplicationRecord
include ConcernsOnRails::Sluggable
sluggable_by :title
end
post = Post.create!(title: "Hello World")
post.slug # => "hello-world"
If the slug source is changed, the slug will auto-update.
Use for models that need ordering.
class Task < ApplicationRecord
include ConcernsOnRails::Sortable
sortable_by :position
end
Task.create!(name: "B")
Task.create!(name: "A")
Task.first.name # => "B" (sorted by position ASC)
You can customize the sort field and direction:
class PriorityTask < ApplicationRecord
include ConcernsOnRails::Sortable
sortable_by priority: :desc
end
Additional features:
- π Automatically sets
acts_as_list
on the configured column - π Adds default sorting scope to your model
βοΈ Supports custom direction::asc
or:desc
- π Validates that the sortable field exists in the table schema
- π§ Compatible with scopes and ActiveRecord queries
- π Can be reconfigured dynamically within the model using
sortable_by
Manage published/unpublished records using a published_at
field.
class Article < ApplicationRecord
include ConcernsOnRails::Publishable
end
Article.published # => returns only published articles
Article.unpublished # => returns only unpublished articles
article = Article.create!(title: "Draft")
article.published? # => false
article.publish!
article.published? # => true
article.unpublish!
article.published? # => false
Additional features:
- β
published?
returns true ifpublished_at
is present and in the past - π
publish!
setspublished_at
to current time - π«
unpublish!
setspublished_at
tonil
- π Add scopes:
.published
,.unpublished
, and a default scope (optional) - π° Ideal for blog posts, articles, or any content that toggles visibility
- π§© Lightweight and non-invasive
- π§ͺ Easy to test and override in custom implementations
Soft delete records using a timestamp field (default: deleted_at
).
class User < ApplicationRecord
include ConcernsOnRails::SoftDeletable
# Optional: customize field and touch behavior
soft_deletable_by :deleted_at, touch: true
end
User.without_deleted # => returns only active users
User.soft_deleted # => returns soft-deleted users
User.active # => same as without_deleted
User.all # => returns only non-deleted by default (default_scope applied)
user.soft_delete! # Soft delete the user (sets deleted_at)
user.deleted? # => true
user.soft_deleted? # => true (alias)
user.is_soft_deleted? # => true (alias)
user.restore! # Restore the user (sets deleted_at to nil)
user.deleted? # => false
user.really_delete! # Hard delete the record from DB
User.destroy_all # Soft delete all users (sets deleted_at)
User.really_destroy_all # Hard delete ALL users (removes from DB)
You can use the following hooks to run logic before/after soft delete or restore:
class User < ApplicationRecord
include ConcernsOnRails::SoftDeletable
def before_soft_delete
# Code to run before soft delete
end
def after_soft_delete
# Code to run after soft delete
end
def before_restore
# Code to run before restore
end
def after_restore
# Code to run after restore
end
end
- Default field is
deleted_at
, can be changed withsoft_deletable_by :your_field
touch: false
to skip updating updated_at when soft deleting/restoring- Aliases for
deleted?
:soft_deleted?
,is_soft_deleted?
- All scopes and methods work seamlessly with ActiveRecord
To build the gem:
gem build concerns_on_rails.gemspec
To install locally:
gem install ./concerns_on_rails-1.0.0.gem
Bug reports and pull requests are welcome!
This project is licensed under the MIT License.
π»π³ HoΓ ng Sa and TrΖ°α»ng Sa belong to Viα»t Nam.
The source code is available on GitHub:
π https://github.com/VSN2015/concerns_on_rails
Feel free to star βοΈ, fork π΄, or contribute with issues and PRs.