module Unread::Readable::InstanceMethods

Public Instance Methods

mark_as_read!(options) click to toggle source
# File lib/unread/readable.rb, line 128
def mark_as_read!(options)
  reader = options[:for]
  self.class.assert_reader(reader)

  ReadMark.transaction do
    if unread?(reader)
      rm = read_mark(reader) || read_marks.build
      rm.reader_id   = reader.id
      rm.reader_type = reader.class.base_class.name
      rm.timestamp   = self.send(readable_options[:on])
      rm.save!
    end
  end
end
unread?(reader) click to toggle source
# File lib/unread/readable.rb, line 113
def unread?(reader)
  if self.respond_to?(:read_mark_id) && read_mark_id_belongs_to?(reader)
    # For use with scope "with_read_marks_for"
    return false if self.read_mark_id

    if global_timestamp = reader.read_mark_global(self.class).try(:timestamp)
      self.send(readable_options[:on]) > global_timestamp
    else
      true
    end
  else
    self.class.unread_by(reader).exists?(self.id)
  end
end

Private Instance Methods

read_mark(reader) click to toggle source
# File lib/unread/readable.rb, line 145
def read_mark(reader)
  read_marks.where(reader_id: reader.id, reader_type: reader.class.base_class.name).first
end
read_mark_id_belongs_to?(reader) click to toggle source
# File lib/unread/readable.rb, line 149
def read_mark_id_belongs_to?(reader)
  self.read_mark_reader_id.to_i == reader.id &&
    self.read_mark_reader_type == reader.class.base_class.name
end