2016-04-16 1 views
1

ma première question, soyez doux :-)Rails 4: la bonne façon d'initialiser la table de hachage à partir de la base de données?

J'ai une application de rails en utilisant des morceaux de texte d'une base de données (table contient fondamentalement une courte clé k et le texte correspondant, sorte de comme i18n, mais pour des raisons de portée ici je ne veux pas utiliser cela maintenant). Fait une petite fonction d'aide pour les vues pour obtenir le texte correspondant par clé, le long des lignes de "Text.find_by k: x". Enfer d'une charge de base de données mais permettant aux textes d'être changés dynamiquement par un CMS.

Mais comme il s'est avéré que les textes changent rarement, j'ai voulu précharger la table entière dans un hachage à la place. Puisque je ne suis pas sûr où mettre une telle substance d'initialisation, et aussi parce que je pensais que le chargement paresseux pourrait être cool, voici ce que je ne (simplifié):

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 

Ce qui semble fonctionner à merveille. Mais puisque je suis un débutant ici, je me demande si quelqu'un pense qu'il existe une meilleure solution, ou une solution qui est plus "la voie des rails"? Des commentaires très appréciés!

Répondre

0

Ce que vous avez fait est plutôt cool. Je serais plus susceptible de faire une méthode items qui note les éléments, par opposition à une méthode explicite initItems. Ce serait la solution la plus conventionnelle.

Utilisez pluck pour obtenir uniquement les champs de la table dont vous avez besoin ... cela rendra l'appel SQL plus efficace. Dans ce cas, pluck retourne un tableau de tableaux à deux éléments, il est facile d'utiliser la méthode to_h pour le convertir en hachage.

(, convention est d'utiliser également snake_case pour les noms de méthode)

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