2017-08-24 2 views
0

Ich bin mir nicht sicher, wie diese Frage zu gestalten, ich bin auf der Suche nach einem Design-Problem zu lösen.Handling Bedingungen auf Klassenebene basierend auf Zuordnung

Ich benutze ActiveRecord.

Ein Agency kann mehrere documents haben.

documents hat eine Spalte additional_details vom Typ jsonb. Enthält Hash-Details.

additional_details Spalte hat einen anderen Satz von Schlüsselwertpaaren basierend auf agency.

Beispiel:

doc1 = agency1.documents.first.additional_details => { xml_url: '', ... } 
doc2 = agency2.documents.first.additional_details => { feed_url1: '', ... } 

Agency1 und Agentur2 sind beispielsweise Objekte der Agentur.


Wenn ich einen Anruf machen die URL wie document.additional_details.get_url

zu holen I Bedingungen wie

def get_url 
    if agency1.name == 'Utah' 
    return additional_details[xml_url] 
    elsif 
    so on 
    elsif 
    so on 
    end 
end 

das ist keine gute Praxis schreiben kann ich fühle.

Ich glaube, wir können dies auf Klassenebene lösen. Hinweis: Ich muss dies auf Präsentationsebene lösen, ich verwende Dekorateure.

Edit:

Eine besondere Agentur gleiche Schlüssel innerhalb additional_details Spalte haben aber Werte sind sicherlich anders.

+0

Ist nicht der Name des Schlüssels, in dem die URL in den additional_details eines Attributs der Agentur gefunden wird? Dann sollte es als Spalte in die Agentur-Tabelle gehen. Es ist mir nicht klar, was Sie mit "if agentur1" meinen. Ist 'agency1' eine Variable oder steht sie für etwas wie' if self.name == "Some special agency" '? –

+0

@SvenKoschnicke du hast recht, ich habe es aktualisiert. Überprüfen Sie auch meine Bearbeitungsbereich – Nithin

Antwort

0

Ich nehme an, das sind Active Record-Klassen? Wo ist agency1 definiert? Sie sollten fast nie basierend auf bestimmten Instanzen hart codiert werden, stattdessen sollten solche Daten Teil des Datensatzes und seiner Instanz sein.

Es ist besonders unklar, warum Sie überhaupt verschiedene Arten von "URL" haben, und nicht nur eine einfache url String-Spalte in der documents Tabelle. Warum verwendet agency1xml_url, aber agency2 verwendet feed_url1?

Aber als Beispiel, wenn jede Agentur ein Präfix sagen definiert (sagen wir den Domain-Namen/Dateispeicher, und die Dokumente nur die relative/local-Adresse), sagen:

agency1.document_root = "https://example.com/documents/" 
agency1.documents.first.rel_url = "web/rails/rails_example.pdf" 

Dann in der Document Klasse Sie tun könnte:

def url 
    agency.document_root + rel_url 
end 

Was gibt Ihnen dann die:

agency1.documents.first.url 
+0

Ich verwende ActiveRecord, Agentur1 und Agentur2 sind AR-Objekte. – Nithin

+0

basierend auf Agentur, unterscheidet sich die URL. Das ist der springende Punkt, den ich versuche zu lösen. – Nithin

+0

Aber kann es nicht nur ein 'document_root' oder eine andere" Vorlage "sein? –

0

Fügen Sie Ihrem Modell Agency ein Feld hinzu, in dem Sie den Schlüssel für die URL im zusätzlichen Datenhash speichern. Nehmen wir an, Sie benennen das Feld url_key.Dann können Sie tun

def get_url 
    additional_details[agency.url_key] 
end 

Beachten Sie, dass ich davon ausgehen, dass get_url ein Verfahren auf dem Document Modell.

+0

'get_url' wird hier als Beispiel verwendet. Ich kann dies nicht auf Agenturebene tun – Nithin

+0

@Nithin können Sie das Beispiel in Ihrer Frage verfeinern, um klarer zu machen, dass es nicht möglich ist, das zu tun? Ich würde gerne verstehen, warum. –

Verwandte Themen