Skip to content

Instantly share code, notes, and snippets.

@mike-bhs
Last active February 1, 2018 20:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mike-bhs/66460322579460b6c9c0ccbd54b2acc2 to your computer and use it in GitHub Desktop.
Save mike-bhs/66460322579460b6c9c0ccbd54b2acc2 to your computer and use it in GitHub Desktop.
Polymorphic following without dependencies on objects that are followed

##Polymorphic following without dependencies on objects that are followed followable_concern.rb

module FollowableConcern
  extend ActiveSupport::Concern

  included do
    has_many :personal_followers, class_name: 'Core::Follow', as: :followingable, dependent: :destroy
    has_many :personal_followings, class_name: 'Core::Follow', as: :followerable, dependent: :destroy

    def followers
      personal_followers.map(&:followerable)
    end

    def followings
      personal_followings.map(&:followingable)
    end

    def follows?(person)
      personal_followings.find_by(followingable: person).present?
    end
  end
end

follow.rb

class Follow < ActiveRecord::Base
  belongs_to :followingable, polymorphic: true
  belongs_to :followerable, polymorphic: true
end

##How I use it

user.rb

class User < ActiveRecord::Base
  include FollowableConcern
  # some code here . . .
end

follows_controller

class FollowsController < ApplicationController
  before_action :set_person
  
  def create
    @following = current_user.personal_followings.create(followingable: @person)
    # some response here . . .
  end
  
  def destroy
    @following = current_user.personal_followings.find_by(followingable: @person)
    @following.destroy
    # some response here . . .
  end
  
  private 
  
  def set_person
    @person = params[:person_entity].from_entity
  end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment