2016-06-12 6 views
1

Ich möchte eine Site-weite Ankündigung Feature in meiner Rails App implementieren.So implementieren Sie Ankündigungen in Ruby on Rails App mit pro Benutzer Kontrolle von gelesen/angezeigt

Administratoren können Ankündigungen erstellen und start_date und expiration_date definieren.

Ich würde auch gerne wissen, wenn ein Benutzer eine Ankündigung angesehen hat, und wenn er auf "Ankündigung" geklickt hat, würde es nicht mehr in der Ansicht angezeigt.

Nachdem ich darüber nachgedacht habe, überlege ich, eine Has Many :through Modellverknüpfung zu erstellen. Grundsätzlich ein User has_many Announcements through: UserAnnouncements.

Also würde ich zwei neue Modelle erstellen, eine Vorankündigung (wo Admins den Text festlegen würden, Start- und Enddatum) und eine Join-Tabelle (UserAnnouncements), wo ich die Informationen über den jeweiligen Status des Benutzers speichern könnte Ankündigung (viewed und dismissed grundsätzlich).

Wäre das ein vernünftiger Ansatz?

Meine Hauptfrage ist jetzt in der Erstellung von Ankündigungen. Ich habe 15k Benutzer, und es dauert viel Zeit, die anouncements zu schaffen, wenn ich es wie folgt tun:

User.find_each do |user| 
    announcement = Announcement.new 
    announcement.user = user 
    announcement.save 
end 

Dies dauert etwa 30 Sekunden zu laufen. Was wäre wenn ich 100k Benutzer hätte?

Würde ein vernünftiger Ansatz, um die Announcement Modelle werden schaffen und zeigt es jeden Benutzer, unless es hatte ein HideAnnouncement Modell, das user_id == current_user? Wie würde ein solcher ActiveRecord aussehen?

+1

Ich schlage vor, erstellen Sie eine Assoziation Datensatz nach Anzeige oder Kündigung Ankündigung. Und zeigen Sie die Ankündigung an, es sei denn, es gibt einen Datensatz in der Zuordnungstabelle mit dem bestimmten Benutzer. Stellen Sie außerdem sicher, dass "user_id" und "answer_id" indexiert sind. Nach dem Erstellen der Ankündigung müssen Sie keinen zusätzlichen Datensatz für jeden Benutzer erstellen. – Kkulikovskis

Antwort

0

Natürlich könnten Sie es von Grund auf neu erstellen, aber ich mag die Idee, "keine Zeit mit Nicht-Kern-Sachen zu verschwenden".

Das gesagt, Sie könnten versuchen, Paul Revere oder Starbust Edelsteine, beide haben als Ziele anzeigen Website-weite Ankündigungen an die Benutzer.

Als Beispiel, nach der Einstellung von Starbust, fügen Sie einfach eine Testankündigung mit Starburst::Announcement.create(:body => "Our app now features lots of balloons! Enjoy!") hinzu.

Wenn Sie Ihre eigenen erstellen möchten, wäre auch ein Blick auf ihre Quelle wertvoll.