| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Ruby gem to manage read/unread status of ActiveRecord objects - and it's fast.
https://github.com/ledermann/unread/releases
Step 1: Add this to your Gemfile:
gem 'unread'and run
bundleStep 2: Generate and run the migration:
rails g unread:migration
rake db:migrateclass User < ActiveRecord::Base
acts_as_reader
end
class Message < ActiveRecord::Base
acts_as_readable :on => :created_at
end
message1 = Message.create!
message2 = Message.create!
## Get unread messages for a given user
Message.unread_by(current_user)
# => [ message1, message2 ]
message1.mark_as_read! :for => current_user
Message.unread_by(current_user)
# => [ 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.unread_by(current_user)
# => [ ]
# Optional: Cleaning up unneeded markers.
# Do this in a cron job once a day.
Message.cleanup_read_marks!The main idea of this gem is to manage a list of read items for every reader after a certain timestamp.
The gem defines a scope doing a LEFT JOIN to this list, so your app can get the unread items in a performant manner. Of course, other scopes can be combined.
It will be ensured that the list of read items will not grow up too much:
Overall, this gem can be used for large data. Please have a look at the generated SQL queries, here is an example:
# Assuming we have a user who has marked all messages as read on 2010-10-20 08:50
current_user = User.find(42)
# Get the unread messages for this user
Message.unread_by(current_user)Generated query:
SELECT messages.*
FROM messages
LEFT JOIN read_marks ON read_marks.readable_type = 'Message'
AND read_marks.readable_id = messages.id
AND read_marks.member_id = 42
AND read_marks.timestamp >= messages.created_at
WHERE read_marks.id IS NULL
AND messages.created_at > '2010-10-20 08:50:00'Hint: You should add a database index on messages.created_at.
There are two other gems/plugins doing a similar job:
Unfortunately, both of them have a lack of performance, because they calculate the unread records doing a find(:all), which should be avoided for a large amount of records. This gem is based on a timestamp algorithm and therefore it's very fast.
Copyright (c) 2010-2014 Georg Ledermann, released under the MIT license
| Back | FazBrowse Home | New Git URL |