2009-06-19 11 views
2

Je suis conscient qu'ActiveRecord fournit une méthode to_json qui permet de filtrer les champs de la sortie JSON en utilisant: only et: except.Tableau d'ActiveRecords à JSON

À l'heure actuelle, je suis en utilisant ce qui suit pour formater un tableau à partir d'une découverte JSON:

@customers = Customer.find(:all) 
... 
format.js { render :json => @customers} 

Comment pourrais-je être en mesure de sélectionner les champs à la production dans les objets du tableau? Y a-t-il un raccourci ou dois-je le faire à la main?

Cheers, Adam

Répondre

2

Vous pouvez remplacer la méthode to_json de la classe de modèle si vous souhaitez appliquer globalement la modification pour le modèle.

Par exemple, pour exclure les valeurs nulles du JSON rendu, vous pouvez remplacer la méthode ActiveRecord originale to_json

def to_json(options) 
    hash = Serializer.new(self, options).serializable_record 
    hash = { self.class.model_name => hash } if include_root_in_json 
    ActiveSupport::JSON.encode(hash) 
    end 

avec dans votre classe modèle:

def to_json(options) 
    hash = Serializer.new(self, options).serializable_record.reject {|key, value| value.nil? } 
    hash = { self.class.model_name => hash } if include_root_in_json 
    ActiveSupport::JSON.encode(hash) 
    end 
1

Si vous peep dans la ActionController :: La classe de base, vous verrez qu'il appelle to_json sur votre collection immédiatement (aucune option supplémentaire utilisé), alors vous devez avoir Déjà préparé. Donc, si dans votre action vous n'utilisez pas les attributs qui ne sont pas rendus à JSON, vous pouvez remplacer votre découverte avec

@customers = Customer.find(:all, :select => ["id", ...]) 

pour ne sélectionner que ceux que vous avez besoin.

2

Je pense que vous avez répondu à votre propre question. Avec Rails 2.3.x vous pouvez utiliser ce qui suit:

@customers = Customer.all #Shortcut for to Customer.find(:all) 
respond_to do |format| 
    format.js { render :json => @customers.to_json(:only=>[:column_one, :column_two]} 
end 
Questions connexes