2016-04-16 5 views
1

meine erste Frage, sei sanft :-)Rails 4: der richtige Weg, um Hash-Tabelle aus der Datenbank zu initialisieren?

Ich habe eine Rails-Anwendung mit Textstücken aus einer Datenbank (Tabelle enthält im Grunde eine kurze Taste k und den entsprechenden Text; eine Art wie i18n, aber aus Gründen außerhalb Umfang hier möchte ich jetzt nicht verwenden). Erstellt eine kleine Hilfsfunktion für die Ansichten, um den übereinstimmenden Text nach Schlüssel zu erhalten, in der Art von "Text.find_by k: x". Die Hölle einer Datenbank laden, aber die Texte können dynamisch von einem CMS geändert werden.

Da sich aber herausstellte, dass sich die Texte selten ändern, wollte ich stattdessen die gesamte Tabelle in einen Hash laden. Da ich nicht sicher bin, wo solche Initialisierung Sachen zu setzen, und auch, weil ich faul Laden dachte kühl sein könnte, hier ist das, was ich habe (vereinfacht):

module MainHelper 
... 
@@items = nil 

def getText(x) 
    initItems if [email protected]@items 
    @@items[x] 
end 

private 

def initItems 
    @@items = {} 
    Text.all.each {|t| @@items[t.k] = t.text} #load from model 
end 

Welche sehr gut zu funktionieren scheint. Aber da ich hier ziemlich neu bin, frage ich mich, ob irgendjemand denkt, dass es eine bessere Lösung gibt, oder eine Lösung, die eher "die Schiene" ist? Alle Kommentare sehr geschätzt!

Antwort

0

Was Sie getan haben, ist ziemlich cool. Ich würde eher eine Methode items machen, die die Elemente im Gegensatz zu einer expliziten initItems Methode Memoizes. Das wäre die konventionellere Lösung.

Verwenden Sie pluck, um nur die Felder in der Tabelle zu erhalten, die Sie benötigen ... damit wird der SQL-Aufruf effizienter.

weil pluck in diesem Fall ein Array von Zwei-Element-Arrays zurückgibt, ist es einfach, die to_h-Methode zu verwenden, um es in einen Hash zu konvertieren.

(auch ist Konvention für snake_case Methodennamen verwenden)

module MainHelper 
    ... 
    @@items = nil 

    def get_text(x) 
    items[x] 
    end 

    private 

    def items 
    @@items ||= Text.pluck(:k,:text).to_h #load from model 
    end 

end