Skip to content

Commit

Permalink
Added scope "with_read_marks_for"
Browse files Browse the repository at this point in the history
  • Loading branch information
ledermann committed Mar 15, 2012
1 parent a06f3a0 commit aeab767
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 1 deletion.
9 changes: 9 additions & 0 deletions README.md
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -71,13 +71,22 @@ Step 2: Add this migration:
message1 = Message.create! message1 = Message.create!
message2 = Message.create! message2 = Message.create!


## Get unread messages for a given user
Message.unread_by(current_user) Message.unread_by(current_user)
# => [ message1, message2 ] # => [ message1, message2 ]


message1.mark_as_read! :for => current_user message1.mark_as_read! :for => current_user
Message.unread_by(current_user) Message.unread_by(current_user)
# => [ message2 ] # => [ message2 ]


## Get all messages including the read status for a given user
messages = Message.with_read_marks_for(current_user)
# => [ message1, message2 ]
messages[0].unread?(current_user)
# => false
messages[1].unread?(current_user)
# => true

Message.mark_as_read! :all, :for => current_user Message.mark_as_read! :all, :for => current_user
Message.unread_by(current_user) Message.unread_by(current_user)
# => [ ] # => [ ]
Expand Down
4 changes: 4 additions & 0 deletions changelog.md
Original file line number Original file line Diff line number Diff line change
@@ -1,3 +1,7 @@
0.1.0 - unreleased

* Added scope "with_read_marks_for"

0.0.7 - 2012/02/29 0.0.7 - 2012/02/29


* Cleanup files * Cleanup files
Expand Down
22 changes: 21 additions & 1 deletion lib/unread/acts_as_readable.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -49,6 +49,15 @@ def acts_as_readable(options={})
result result
} }


send scope_method, :with_read_marks_for, lambda { |user|
assert_reader(user)

{ :select => "#{self.table_name}.*, read_marks.id AS read_mark_id",
:joins => "LEFT JOIN read_marks ON read_marks.readable_type = '#{self.base_class.name}'
AND read_marks.readable_id = #{self.table_name}.id
AND read_marks.user_id = #{user.id}
AND read_marks.timestamp >= #{self.table_name}.#{readable_options[:on]}" }
}
extend ReadableClassMethods extend ReadableClassMethods
include ReadableInstanceMethods include ReadableInstanceMethods
end end
Expand Down Expand Up @@ -149,7 +158,18 @@ def assert_reader(user=nil)


module ReadableInstanceMethods module ReadableInstanceMethods
def unread?(user) def unread?(user)
self.class.unread_by(user).exists?(self) if self.respond_to?(:read_mark_id)
# For use with scope "with_read_marks_for"
return false if self.read_mark_id

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


def mark_as_read!(options) def mark_as_read!(options)
Expand Down
12 changes: 12 additions & 0 deletions test/unread_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ def test_scope
} }
end end


def test_with_read_marks_for
@email1.mark_as_read! :for => @reader

emails = Email.with_read_marks_for(@reader).all

assert emails[0].read_mark_id.present?
assert emails[1].read_mark_id.nil?

assert_equal false, emails[0].unread?(@reader)
assert_equal true, emails[1].unread?(@reader)
end

def test_scope_after_reset def test_scope_after_reset
@email1.mark_as_read! :for => @reader @email1.mark_as_read! :for => @reader


Expand Down

0 comments on commit aeab767

Please sign in to comment.