There are many options to add publishing ability to your Rails model. The good reference is: https://naturaily.com/blog/ruby-on-rails-enum
Let's assume we have an Article
model and we want to make it publishable
.
Add activerecord-postgres_enum to your Gemfile
gem 'activerecord-postgres_enum'
You need this solution if you want to use schema.rb
.
Let's create a Publishable module
app/models/concerns/publishable.rb
module Publishable
extend ActiveSupport::Concern
STATUSES = %w[draft reviewing published unpublished].freeze
end
Create PostgreSQL enum
rails g migration add_content_status_type
class AddContentStatusType < ActiveRecord::Migration[6.0]
def change
create_enum :content_status, Publishable::STATUSES
end
end
This will create the PostgreSQL ENUM type.
Now it's time to add your status to Article model.
rails g migration add_status_to_articles status:content_status
This will create a migration to add status
to the Article
model.
I recommend defining the default value as the following:
add_column :articles, :status, :content_status, default: 'draft'
Also, if you need to make various queries to your model based on the status, add an index:
add_index :articles, :status
Add the publishing ability to your article:
class Article < ApplicationRecord
include Publishable
end
We are still missing all Rails scopes and other enum features.
The updated version of Publishable concern
module Publishable
extend ActiveSupport::Concern
STATUSES = %w[draft reviewing published unpublished].freeze
included do
enum status: STATUSES.zip(STATUSES).to_h
end
end
This adds all Rails scopes and magic. For example:
Operator.published
operator.published?
operator.published!
Happy Hacking!