Skip to content

Instantly share code, notes, and snippets.

@firedev
Created June 7, 2014 05:04
Show Gist options
  • Save firedev/5a4b537014dcab54cfd4 to your computer and use it in GitHub Desktop.
Save firedev/5a4b537014dcab54cfd4 to your computer and use it in GitHub Desktop.
ReadMarkable
module ReadMarkable
extend ActiveSupport::Concern
included do
has_many :read_marks
def touch_read_at
update_column(:read_at, Time.now)
end
def mark_as_unread_except current_user
ReadMark.delete_all(inquiry_id: id)
ReadMark.create(inquiry_id: id, user_id: current_user.id)
touch_read_at
end
def mark_as_unread_for current_user
ReadMark.delete_all(inquiry_id: id)
touch_read_at
end
def mark_as_unread_for_priveleged current_user
priveleged_users = User.select(:id).privileged
ReadMark.delete_all(inquiry_id: id, user_id: priveleged_users.pluck(:id))
ReadMark.create(inquiry_id: id, user_id: current_user.id)
touch_read_at
end
def mark_as_read_for current_user
ReadMark.delete_all(inquiry_id: id, user_id: current_user.id)
ReadMark.create(inquiry_id: id, user_id: current_user.id)
touch_read_at
end
def unread? current_user
ReadMark.where(inquiry_id: id, user_id: current_user.id).count.zero?
end
def self.count_unread_by current_user
count - includes(:read_marks).where(read_marks: { user_id: current_user.id }).count
end
def self.ordered_by_unread_for current_user
joins(
"LEFT JOIN read_marks ON read_marks.inquiry_id = inquiries.id
AND read_marks.user_id = #{current_user.id}"
).
order('IF(read_marks.inquiry_id IS NULL, 1, 0) DESC').
readonly(false)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment