2010-02-18 6 views
2

J'ai une table avec BEAUCOUP de lignes, j'ai juste besoin des identifiants de certaines lignes. La voie lente est d'appelerActiveRecord sélectionner des attributs sans objets AR

SomeARClass.find(:all, :conditions => {:foo => true}, :select => :id) 

Ce retourne des objets AR ...

Est-il possible d'appeler une sélection sur une classe et avoir le retour d'une structure de données rubis ancienne plaine. Quelque chose comme ceci:

SomeARClass.select(:id, :conditions => {:foo => true}) 
-> [1,2,3] 

Répondre

4
ActiveRecord::Base.connection.select_all(sql) 

ou

SomeARClass.connection.select_all(sql) 

Voici ce que vous voulez utiliser. Il renvoie un tableau de hachages. Il devrait être utilisé avec parcimonie cependant. SQL codé à la main est ce que ActiveRecord a été construit pour remplacer. Je n'utilise que dans les zones critiques de performance où la construction et le retour des objets AR est trop lent.

+0

utilisez SomeARClass.pluck (: attribut) à la place. –

3

Je ne pense pas qu'il y ait quelque chose comme SomeARClass.select(:id, :conditions => {:foo => true}) mais vous avez deux options

  1. SomeARClass.find(:all, :conditions => {:foo => true}, :select => :id).map(&:id) 
    #=> [1,2,3,4] 
    
  2. id_hash = ActiveRecord::Base.connection.select_all('select id from tablename') 
    #=> [{"id"=>"1"}, {"id"=>"2"}, {"id"=>"3"}, {"id"=>"4"}] 
    
    id_hash.map(&:values).flatten 
    #=> ["1", "2", "3", "4"] 
    

La deuxième option renvoie uniquement un hachage et pas les objets d'enregistrement actifs, mais il semble un peu hackish.

2

La méthode pluck est exactement ce que vous voulez, sans compromettre la mauvaise pratique SQL:

SomeARClass.where(:foo => true).pluck(:id) 

Je crois que cela devrait être la réponse sélectionnée!

+1

oui cela devrait être la réponse choisie. –

Questions connexes