30 lines
821 B
Ruby
30 lines
821 B
Ruby
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).try(:first)
|
|
end
|
|
|
|
end
|