Les notes de Rémi Prévost
vim, git, ruby, html5 et autres buzzwords.


Un type de champ MySQL magique avec JSON

J’ai développé le plugin has_json_fields en travaillant sur Quincaillerie sucrée où il était nécessaire de stocker un hachage arbitraire (la variable params de Rails qui contient des informations fournies par PayPal lors de notifications IPN) dans la base de données.

Comme il est préférable de stocker ces informations en format texte (car la structure du hachage n’est jamais la même), JSON m’a semblé être la meilleure solution. Cependant, il peut être fastidieux de toujours convertir les données lorsqu’on les modifie ou que l’on veut accéder à une clé précise :

require 'json'
class OrdersController < ApplicationController

  def show
    order = Order.get params[:id]
    metadata = JSON.parse order.paypal_metadata
    puts metadata["address_name"]
  end

  def update
    order = Order.get params[:id]
    metadata = { :foo => :bar }
    order.paypal_metadata = metadata.to_json
    order.save
  end

end

C’est donc pour éviter toutes ces conversions manuelles que j’ai décidé de créer has_json_fields, qui n’est en fait qu’un très simple plugin qui n’ajoute qu’une seule méthode éponyme à tous les objets.

class Order < ActiveRecord::Base
  has_json_fields :paypal_metadata
end

Ensuite, on peut l’utiliser ainsi :

class OrdersController < ApplicationController

  def show
    order = Order.get params[:id]
    puts order.paypal_metadata[:address_name] # les clés sont des symboles
  end

  def update
    order = Order.get params[:id]
    order.paypal_metadata = { :foo => :bar }
    order.save
  end

end

Le code source du plugin est hébergé chez GitHub et disponible sous license MIT.