Module: ActsAsReadable::HelperMethods

Defined in:
lib/acts_as_readable/acts_as_readable.rb

Class Method Summary collapse

Class Method Details

.all_read_at(readable_class, user) ⇒ Object



42
43
44
# File 'lib/acts_as_readable/acts_as_readable.rb', line 42

def self.all_read_at(readable_class, user)
  user[readable_class.acts_as_readable_options[:cache]] if readable_class.acts_as_readable_options[:cache]
end

.outer_join_readings(scope, user) ⇒ Object



46
47
48
# File 'lib/acts_as_readable/acts_as_readable.rb', line 46

def self.outer_join_readings(scope, user)
  scope.joins("LEFT OUTER JOIN readings ON readings.readable_type = '#{readable_type(scope.model)}' AND readings.readable_id = #{scope.model.table_name}.id AND readings.user_id = #{user.id}")
end

.read_conditions(readable_class, user, timestamp) ⇒ Object



27
28
29
30
31
32
# File 'lib/acts_as_readable/acts_as_readable.rb', line 27

def self.read_conditions(readable_class, user, timestamp)
  ["(readings.state IS NULL    AND COALESCE(#{readable_class.table_name}.#{timestamp} <= :all_read_at, FALSE))
 OR (readings.state = 'unread' AND COALESCE(readings.updated_at <= :all_read_at, FALSE))
 OR (readings.state = 'read'   AND #{readable_class.table_name}.#{timestamp} <= readings.#{timestamp})",
 :all_read_at => all_read_at(readable_class, user)]
end

.readable_type(readable_class) ⇒ Object



50
51
52
# File 'lib/acts_as_readable/acts_as_readable.rb', line 50

def self.readable_type(readable_class)
  readable_class.base_class.name
end

.unread_conditions(readable_class, user, timestamp) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/acts_as_readable/acts_as_readable.rb', line 34

def self.unread_conditions(readable_class, user, timestamp)
  # IF there is no reading and it has been updated since we last read all OR there is an unreading and we haven't read all since then
  ["(readings.state IS NULL    AND COALESCE(#{readable_class.table_name}.#{timestamp} > :all_read_at, TRUE))
 OR (readings.state = 'unread' AND COALESCE(readings.updated_at > :all_read_at, TRUE))
 OR (readings.state = 'read'   AND #{readable_class.table_name}.#{timestamp} > readings.#{timestamp})",
 :all_read_at => all_read_at(readable_class, user)]
end