app/models/flag.rb
class Flag < ApplicationRecord
belongs_to :user
belongs_to :flaggable, polymorphic: true, counter_cache: true, touch: true
scope(:by_user_and_flaggable, lambda do |user, flaggable|
where(user_id: user.id,
flaggable_type: flaggable.class.to_s,
flaggable_id: flaggable.id)
end)
scope :for_comments, ->(comments) { where(flaggable_type: "Comment", flaggable_id: comments) }
def self.flag(user, flaggable)
return false if flagged?(user, flaggable)
create!(user: user, flaggable: flaggable)
end
def self.unflag(user, flaggable)
flags = by_user_and_flaggable(user, flaggable)
return false if flags.empty?
flags.destroy_all
end
def self.flagged?(user, flaggable)
return false unless user
!!by_user_and_flaggable(user, flaggable)&.first
end
end