0

Es gibt mehrere Phasen, und da ich noch relativ neu in Schienen bin, bin ich mir nicht sicher, ob ich mich dem bestmöglich annähere.Benutzerdefiniertes Modell Methode, Einstellbereich für das automatische Senden von E-Mails

Benutzer folgen Firmen, Firmen Anwendungen öffnen und schließen an bestimmten Tagen. Wenn ein Benutzer einer Firma folgt, möchte ich, dass er automatisch eine E-Mail erhält, wenn a) die Firmenanmeldung öffnet, b) eine Woche vor dem Schließen der Firmenanträge, c) am Tag, an dem die Firmenanträge geschlossen werden.

Ich habe versucht, benannten Bereich zu verwenden. Ich habe die folgende Modellmethode (ich nehme an, das wird ein wenig Arbeit brauchen), die den Umfang jeder Firma abhängig vom Datum festlegt.

Modell firms.rb

def application_status 
    if open_date == Today.date 
     self.opening = true 
    else 
     self.opening = false 
    end 

    if ((close_day - Today.date) == 7) 
    self.warning = true 
     else 
    self.warning = false 
    end 

    if close_day == Today.date 
    self.closing = true 
     else 
    self.closing = false 
    end 
end 

ich diese Methode möchte auf jeder Firma einmal täglich aufgerufen werden, so dass jedes Unternehmen den angemessenen Umfang hat - so habe ich versucht, mit dem, wenn gem (cron) und der folgende Code. Ausführen der obigen Modellmethode für jede Firma.

Schedule.rb

every 1.day do 
runner "Firm.all.each do |firm| 
    firm.application_status 
end" 
end 

Dann gilt für jede der Bereiche Öffnung, Warnung, Schließen Ich habe eine Methode in der Datei, wenn Zeitpläne, der Einfachheit halber werde ich nur die Öffnungsmethoden zeigen. Die folgenden Abfragen für alle Firmen, auf die der Eröffnungsbereich angewendet wurde, führen die Methode application_open_notification für sie aus.

Schedule.rb

every 1.day do 
runner "Firm.opening.each do |firm| 
    firm.application_open_notification 
end" 
end 

Dies erfordert die folgende Methode in dem Firm.rb Modell

def application_open_notification 
    self.users.each do |user| 
    FirmMailer.application_open(user, self).deliver 
    end 
end 

Was wiederum das letzte Stück des Puzzles ruft ..., die den Benutzer senden sollen eine E-Mail mit dem Namen der Firma.

def application_open(user,firm) 
    @firm = firm 
    @user = user 
    mail to: @user.email, subject: @firm' is now accepting applications' 
    end 
end 

Ist das ein praktikabler Weg, dieses Problem anzugehen? Insbesondere bin ich mit der Codierung im Modell nicht sehr vertraut.

Vielen Dank für jede Hilfe, die Sie anbieten können.

Antwort

1

Ich denke, dass opening, warning und closing Datenbankfelder sind, und Sie haben Bereiche wie:

class Firm < ActiveRecord::Base 
    scope :opening, :where => { :opening => true } 
    # etc 
end 

Es gibt eine allgemeine Regel für die Datenbank (und, na ja, alle Speicher): nicht Dinge aufbewahren, die du berechnen kannst, wenn du nicht musst.

Da der Status einer Anwendung vom Datum des Tages und den Feldern open_date und close_day abgeleitet werden kann, können Sie sie nach Bedarf berechnen, anstatt zusätzliche Felder für sie zu erstellen. Sie können dies mit SQL und Active Record.

scope :opening, :where { :open_date => (Date.today .. Date.today+1) } 
scope :warning, :where { :close_day => (Date.today+7 .. Date.today+8) } 
scope :closing, :where { :close_day => (Date.today .. Date.today+1) } 

(Beachten Sie, dass diese Auswahlzeitbereiche Sie können je nach geändert werden müssen, wenn Sie date oder time Felder verwenden.)

Aber es gibt ein anderes Problem: Was passiert, wenn aus irgendeinem Grund (Computer-Crash, Code-Fehler usw.) Ihr geplantes Programm nicht an einem bestimmten Tag ausgeführt wird? Sie müssen sicherstellen, dass Benachrichtigungen auch dann gesendet werden, wenn etwas kaputt geht. Es gibt zwei Lösungen:

  1. Schreiben Sie Ihren Zeitplan Programm optional ein Datum außer heute akzeptiert (via ARGV)
  2. halten Flaggen für jedes Unternehmen für, ob jede Art von Mitteilung gesendet wurde. Diese müssen in der Datenbank gespeichert werden.

Beachten Sie, dass Bereiche nicht erforderlich sind. Sie sind in der Lage, dies zu tun:

Firm.where(:open_date => (Date.today .. Date.today+1)).each do |firm| 
    #... 
end 

aber der Umfang zumindest die Details kapselt die verschiedenen Gruppen von Datensätzen zu identifizieren.

+0

Ich denke, dass Ihre Idee, den Anwendungsbereich zu überspringen und Modellmethoden zu erstellen, viel sauberer ist, dann kann ich jeden einzelnen einmal am Tag anrufen. Danke, das ist wirklich eine große Hilfe! – RMcNairn