Bijuterie rubin pentru a gestiona starea de citire / necitire a obiectelor ActiveRecord – si este rapid.

Caracteristici

  • Gestioneaza inregistrarile necitite pentru tot ceea ce doriti sa citeasca cititorii (de exemplu, utilizatorii) (cum ar fi mesaje, documente, comentarii etc.)
  • Suporta marcarea ca citita pentru a marca o singura inregistrare ca citita
  • Suporturi marcheaza toate ca citite pentru a marca toate inregistrarile ca citite intr-un singur pas
  • Va ofera un domeniu de aplicare pentru a obtine inregistrarile necitite pentru un anumit cititor
  • Are nevoie de un singur tabel suplimentar de baze de date
  • Cel mai important: Performanta excelenta

Cerinte

  • Ruby 2.6 sau mai nou
  • Rails 4.0 sau mai nou (inclusiv Rails 6)
  • MySQL, PostgreSQL sau SQLite
  • Are nevoie de un camp de marcare a timpului in modelele dvs. (cum ar fi created_at sau updated_at) cu un index de baza de date pe acesta

Jurnal de schimbari

https://github.com/ledermann/unread/releases

Instalare

Pasul 1: adaugati acest lucru la fisierul dvs. Gem:

si fugi

Pasul 2: Generati si executati migrarea:

rails g necitit: migrare rake db: migrare

Faceti upgrade la versiunile anterioare

Daca faceti upgrade de la o versiune mai veche a acestei bijuterii, ar trebui sa cititi notele de actualizare.

Utilizare

clasa Utilizator <ActiveRecord :: Base actes_as_reader # Optional: Permiteti un subset de utilizatori ca cititori doar def self.reader_scope unde (is_admin: true) end end class Mesaj <ActiveRecord :: Base actes_as_readable on:: created_at # Optiunea `on:` seteaza atributul relevant pentru compararea marcajelor de timp. # # Valoarea implicita este: updated_at, astfel incat actualizarea unei inregistrari, care a fost citita de un cititor, o face din nou necitita. # # Folosind: created_at, numai inregistrarile noi vor aparea ca necitite. Actualizarea unei inregistrari # care a fost citita de un cititor, NU o va marca ca necitita. # # Orice alt camp de marcaj de timp existent poate fi folosit ca optiune `on:`. end message1 = Message.create! message2 = Message.create! ## Obtineti mesaje necitite pentru un anumit utilizator Message.unread_by (current_user) # => [mesaj1, mesaj2] mesaj1.mark_as_read! pentru: utilizator_ curent Mesaj.nu citit (utilizator_ curent) # => [mesaj2] ## Obtineti mesaje citite pentru un anumit utilizator Message.read_by (current_user) # => [] message1.mark_as_read! for: current_user Message.read_by (current_user) # => [message1] ## Primiti toate mesajele, inclusiv starea de citire pentru un anumit mesaj de utilizator = Message.with_read_marks_for (current_user) # => [message1, message2] messages [0] .unread ? (current_user) # => mesaje false [1] .unread? (current_user) # => true Message.mark_as_read! : all, for: current_user Message.unread_by (current_user) # => [] Message.read_by (current_user) # => [message1, message2] ## Obtineti utilizatori care nu au citit un mesaj dat user1 = User.create! user2 = User.create! User.have_not_read (mesaj1) # => [utilizator1, utilizator2] mesaj1.

viendo como se follan a mi mujer sin bragas en la calle
zofilia porno rspañol
videos de zofilia incestos gays
española follando videos de lucio saints
incestos lesbicos recopilacion pajas
mujer masturbandose venezolanas desnudas
mujeres normales desnudas española viciosa
tetona amateur forzadas a follar
peliculas porno gay españolas jovencitas pilladas masturbandose
sexo maduras españolas madre española follando con su hijo
porno obligado shemalehd
porno maduras en español vidio pirno
super tetudas maduras lesbianas tetonas
mamada a dos bocas abuela enculada
triple anal pareja follando en la playa
xxx gratis en español xxxgay
swingers españoles incestos jovencitas
follando en casa mujeres fornicando
porno amateur hd bbw abuelas
abuelas porno españolas madres que se follan a sus hijos

mark_as_read! for: user1 User.have_not_read (message1) # => [user2] ## Obtineti utilizatori care au citit un anumit mesaj User. have_read (message1) # => [user1] message1.mark_as_read! for: user2 User.have_read (message1) # => [user1, user2] Message.mark_as_read! : all, for: user1 User.have_not_read (message1) # => [] User.have_not_read (message2) # => [user2] User.have_read (message1) # => [user1, user2] User.have_read (message2) # => [user1] ## Obtineti toti utilizatorii, inclusiv starea lor de citire pentru un anumit mesaj users = User.with_read_marks_for (message1) # => [user1, user2] users [0] .have_read? (message1) # => true users [ 1] .have_read? (Message2) # => false # Optional: Curatarea markerilor inutili # Faceti acest lucru intr-o lucrare cron o data pe zi Message.cleanup_read_marks!

Obtinerea statisticilor citite / necitite printr-o relatie

clasa Document <ApplicationRecord has_many: comments end class Comentariu <ApplicationRecord actes_as_readable on:: created_at appartine_to: document end # Obtineti numarul de comentarii necitite pentru un document document = Document.find (1) default_hash = Hash.new {| h, k | h [k] = {necitit: 0, total: 0}} document.comments.with_read_marks_for (current_user) .reduce (default_hash) do | hash, comentariu | hash [comment.id] [: necitit] + = 1 daca comment.unread? (current_user) hash [comment.id] [: total] + = 1 hash end # => {20 => {: necitit => 1, : total => 10}, 82 => {: necitit => 0,: total => 4}

Folosind with_read_marks_for aici este cheia. Foloseste o singura interogare si se asigura ca urmatoarele necitite? invocatiile folosesc rezultatul primei interogari.

Cum functioneaza?

Ideea principala a acestei bijuterii este de a gestiona o lista de articole citite pentru fiecare cititor dupa un anumit timestamp.

Bijuteria defineste un scop care face o INREGISTRARE STANGA la aceasta lista, astfel incat aplicatia dvs. sa poata obtine elementele necitite intr-un mod performant. Desigur, alte scopuri pot fi combinate.

Se va asigura ca lista articolelor citite nu va creste prea mult:

  • Daca un utilizator foloseste „marcati toate ca citite”, lista sa va fi stearsa si marcajul de timp este setat la ora curenta.
  • Daca un utilizator nu foloseste niciodata „marcati toate ca citite”, lista va creste si va creste odata cu fiecare articol pe care il citeste. Dar exista ajutor: aplicatia dvs. poate utiliza o metoda de curatare care elimina elementele de lista inutile.

In general, aceasta bijuterie poate fi utilizata pentru date mari. Va rugam sa aruncati o privire la interogarile SQL generate, iata un exemplu:

# Presupunand ca avem un utilizator care a marcat toate mesajele ca fiind citite la 20-10-2010 08:50 current_user = User.find (42) # Primiti mesajele necitite pentru acest utilizator Message.unread_by (current_user)

Interogare generata:

SELEGE mesaje. * DIN mesaje LEFT JOIN read_marks ON read_marks.readable_type = “Mesaj” AND read_marks.readable_id = messages.id SI read_marks.reader_id = 42 SI read_marks.reader_type = ‘Utilizator’ SI read_marks.timestamp> = messages.created_at WHERE read_marks .id ESTE NUL SI messages.created_at> ‘2010-10-20 08:50:00’

Sugestie: ar trebui sa adaugati un index de baza de date pe messages.created_at.

Copyright (c) 2010-2021 Georg Ledermann si colaboratorii, eliberat sub licenta MIT