2010-06-28 5 views
4

que je fais un ActiveRecord trouver sur un modèle en tant que telRetourne la requête ActiveRecord en tant que variable, pas en hachage?

@foo = MyModel.find(:all, :select => 'year') 

Comme vous pouvez le voir, je ne ai besoin de la colonne ans de cela, alors ma sortie idéale serait

["2008", "2009", "2010"] 

Au lieu de cela, bien que , je reçois un hachage des modèles, chacun contenant de l'année, comme tel:

[#<MyModel year: "2008">, #<MyModel year: "2009">, #<MyModel year: "2010">] 

je peux boucle à travers comme tel pour le convertir en ma sortie idéale:

@years = [] 
for bar in @foo 
    @years.push(bar.year) 
end 

mais existe-t-il un moyen de récupérer ce résultat pour commencer? (c'est-à-dire sans passer par le traitement supplémentaire?). Si ce n'est pas le cas, quelle est la manière la plus concise de faire ce traitement?

Merci.

Répondre

4

essayer:

@foo = MyModel.find(:all, :select => 'year').map(&:year) 

Vous pouvez également appeler .uniq() sur le résultat pour supprimer les doublons.

@foo = MyModel.find(:all, :select => 'year').map(&:year).uniq 

Ceci est la forme abrégée de

@foo = MyModel.find(:all, :select => 'year').map{ |model| model.year } 

Cette boucle sur le tableau MyModel caisserie un nouveau tableau de valeurs de retour avec dans le bloc (model.year).

ou même code plus court, mais tout d'abord appeler de db:

@foo = MyModel.all.map(&:year) 
+0

Pourriez-vous expliquer ceci s'il vous plaît? –

+0

espérons que ma mise à jour aide à comprendre – jigfox

0

Vous pouvez utiliser map changer toutes les valeurs dans un tableau. Exemple:

@foo = MyModel.find(:all, :select => 'year').map { |model_object| model_object.year } 
+0

vous devez mettre un point entre '' year ') 'et' map! ', Et pourquoi utilisez-vous' map! ',' Map' fonctionnerait bien ici, parce que votre attribution du résultat à une nouvelle variable – jigfox

+0

Bonne prise. Je l'ai édité pour utiliser 'map'. – hundredwatt

1

Si vous ne voulez pas instancier modèles, vous feriez cette façon:

MyModel.connection.select_values("SELECT year FROM my_models") 

Cela retourne un tableau d'objets String. Ensuite, vous pouvez transformer en utilisant les outils Ruby comme bon vous semble.

Questions connexes