2010-10-22 20 views
2

Tout d'abord, je n'utilise pas Rails. J'utilise Sinatra pour ce projet avec Active Record.Enregistrement actif to_json as_json sur la matrice de modèles

Je souhaite pouvoir remplacer to_json ou as_json sur ma classe Model et lui demander de définir certaines options par défaut. Par exemple, j'ai ce qui suit:

class Vendor < ActiveRecord::Base 
    def to_json(options = {}) 
    if options.empty? 
     super :only => [:id, :name] 
    else 
     super options 
    end 
    end 
end 

où le fournisseur a plus d'attributs que juste ID et nom. Dans ma route, j'ai quelque chose comme ce qui suit:

@vendors = Vendor.where({}) 
@vendors.to_json 

Ici @vendors est un fournisseur d'objets Array (évidemment). Le fichier json renvoyé n'appelle cependant pas ma méthode to_json et renvoie tous les attributs de modèle.

Je n'ai pas vraiment la possibilité de modifier la route car j'utilise en fait une gemme sinatra-repos modifiée (http://github.com/mikeycgto/sinatra-rest).

Des idées sur la façon d'obtenir cette fonctionnalité? Je pouvais faire quelque chose comme ce qui suit dans mon sinatra repos petit bijou, mais cela semble stupide:

@PLURAL.collect! { |obj| obj.to_json } 

Répondre

5

Essayez primordial serializable_hash intead:

def serializable_hash(options = nil) 
    { :id => id, :name => name } 
end 

Plus d'informations here.

+0

exactement ce dont j'ai besoin. J'aime le fait que je pourrais aussi ajouter des propriétés qui ne sont pas des attributs. Merci beaucoup! – mikeycgto

3

Si vous substituez as_json au lieu de to_json, chaque élément du tableau formate avec as_json avant que le tableau est converti en JSON

J'utilise ce qui suit pour exposer uniquement les attributs qui ne sont accessibles:

def as_json(options = {}) 
    options[:only] ||= self.class.accessible_attributes.to_a 
    super(options) 
end