Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
articular / lib / articular / model.rb
Size: Mime:
module Articular
  module Model
    def self.included(base)
      base.extend ClassMethods
      base.include InstanceMethods
      base.include Articular::Navigator
      base.include Articular::Archiver
      base.extend FriendlyId

      base.friendly_id :title, use: :slugged

      base.table_name = 'articular_articles'

      base.navigate :scope => :published,
                    :field => :published_at,
                    :order => "published_at DESC, created_at DESC"

      base.archive_fields :single => :published_at,
                          :scope  => :published

      base.before_save :trigger_state_transition_callbacks
    end

    module InstanceMethods
      def should_generate_new_friendly_id?
        title_changed?
      end

      private
      def date_and_title
        [published_at.to_s, title].join(' ')
      end

      def set_published_at
        self.published_at = Date.today if published_at.blank?
      end

      def trigger_state_transition_callbacks
        if 'published' == state
          set_published_at
        end
      end
    end

    module ClassMethods
      def default_scope
        newest_first
      end

      def newest_first
        order(["published_at DESC", "created_at DESC"])
      end

      def oldest_first
        order(["published_at ASC", "created_at ASC"])
      end

      def published
        present.where(state: 'published')
      end

      def drafted
        future.or(where(state: 'drafted'))
      end

      def future
        where("published_at > ?", DateTime.now)
      end

      def present
        where("published_at <= ?", DateTime.now)
      end
    end
  end
end