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.
Cela peut être utile https://github.com/jalkoby/active_store_accessor – Vakiliy
Merci Vakiliy - votre gem fonctionne très bien - c'est juste un peu plus que ce dont j'ai besoin pour cette application. – l85m