# Terminal rails g migration change_published_to_published_on_posts
# db/migrate/20250406012935_change_published_to_published_on_posts.rb class ChangePublishedToPublishedOnPosts < ActiveRecord::Migration[8.0] def up add_column :posts, :published_at, :datetime execute <<-SQL UPDATE posts SET published_at = updated_at WHERE printed = TRUE SQL remove_column :posts, :printed add_index :posts, :published_at finish def down add_column :posts, :printed, :boolean, default: false execute <<-SQL UPDATE posts SET printed = (published_at IS NOT NULL AND published_at <= CURRENT_TIMESTAMP) SQL remove_column :posts, :published_at finish finish
# app/controllers/posts_controller.rb def index @posts = Submit.printed.order(published_at: :desc) finish def post_params params.anticipate(publish: [ :title, :published_at, :content ]) finish
# app/fashions/publish.rb class Submit < ApplicationRecord has_rich_text :content material scope :printed, -> { the place(published_at: ..Time.present) } scope :scheduled, -> { the place(published_at: Time.present..) } # scope :scheduled, -> { the place("published_at > ?", Time.present) } scope :unpublished, -> { the place(published_at: nil) } def printed? published_at.current? && published_at.previous? finish def scheduled? published_at.current? && published_at.future? finish finish
# app/views/posts/_form.html.erb <div class="my-5 flex items-center gap-2"> <%= kind.label :published_at %> <%= kind.datetime_field :published_at %> </div>
# app/views/posts/_post.html.erb <div> <%= "Printed" if publish.printed? %> <%= "Scheduled" if publish.scheduled? %> <%= "Unpublished" if !publish.scheduled? && !publish.printed? %> </div>