2014-06-18 3 views
0

J'utilise hstore sur un de mes modèles pour stocker un hachage avec des valeurs flottantes. J'ai besoin d'accéder périodiquement et d'effectuer des calculs les valeurs dans le magasin.Rails + Postgres - hstore conversion automatique de chaînes

Ma solution actuelle pour travailler avec ces valeurs est de les convertir pour flotter partout où j'y accède, ce qui est très peu DRY. Existe-t-il un moyen pour moi de modifier la méthode store_accessor pour convertir automatiquement en flottant toutes les valeurs que j'ai lues du magasin?

Je sais que je peux le faire à des touches spécifiques en écrivant une fonction pour eux as described in the docs mais j'ai une très longue liste de touches possibles, de sorte que cette façon est également pas très sec.

+0

Cela peut être utile https://github.com/jalkoby/active_store_accessor – Vakiliy

+0

Merci Vakiliy - votre gem fonctionne très bien - c'est juste un peu plus que ce dont j'ai besoin pour cette application. – l85m

Répondre

1

Je n'ai pas utilisé hstore auparavant, mais j'ai étudié la documentation que vous avez fournie dans la question. Eh bien, hstore semble vraiment utile (dommage que ce soit disponible uniquement dans DB postgreSQL, mais certainement appris quelque chose de nouveau).

À la lecture de la documentation,

NOTE - Si vous utilisez PostgreSQL colonnes spécifiques comme hstore ou JSON il n'y a pas besoin de la sérialisation fournie par magasin. Simplement, utilise plutôt store_accessor pour générer les méthodes d'accès. Sachez que ces colonnes utilisent un hachage avec chaîne de caractères et n'autorisent pas l'accès en utilisant un symbole.

aussi:

Les noms d'attributs stockés peuvent être récupérés à l'aide stored_attributes.

User.stored_attributes[:settings] # [:color, :homepage]

Alors, nous allons obtenir les champs séparés dans un hachage stored_attribute utilisant stored_attributes et vont recevoir les champs nous déclarés sur les stored_attribute comme un tableau. Maintenant, nous devons remplacer les accesseurs pour tous les éléments du tableau. Nous pouvons utiliser define_method pour remplacer dynamiquement les accesseurs. C'est ce que j'ai trouvé.

class WorkingBill < ActiveRecord::Base 
    store_accessor :prices, :cost_price, :selling_price 

    stored_attributes[:prices].each do |price_column_name| 
    define_method("#{key}=") do |value| 
     super(value.to_f) 
    end 

    define_method(key) do 
     super.to_f 
    end 
    end 
end 

Je n'ai pas testé ce code car je n'ai pas d'environnement de développement pour le moment. En outre, je doute que l'appel super fonctionnera à l'intérieur define_method. Alors, essayez-le. Je vais également le tester une fois que j'aurai un environnement de développement.

Aussi, comme @Vakily a commenté, la gemme https://github.com/jalkoby/active_store_accessor semble le faire mieux et gère également les champs booléens, entiers.

+0

Fonctionne très bien, merci! – l85m