2010-02-18 34 views
2

我有一個有很多行的表,我只需要某些行的ID。 慢的方法是調用ActiveRecord選擇沒有AR對象的屬性

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

這將返回AR對象...

有沒有辦法來調用選擇一類,並使其返回一個普通的老紅寶石數據結構。事情是這樣的:

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

回答

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

SomeARClass.connection.select_all(sql) 

這是您要使用的東西。它返回一個哈希數組。它應該謹慎使用,但。手動編碼的SQL是ActiveRecord的內置替代。我只用於構建和返回AR對象速度太慢的性能關鍵區域。

+0

改爲使用SomeARClass.pluck(:attribute)。 – 2014-04-21 21:09:08

3

我不認爲有一個像SomeARClass.select(:id, :conditions => {:foo => true}) 什麼,但你有兩個選擇

  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"] 
    

第二個選項只返回一個散列而不是活動記錄對象,但它確實看起來有點冒失。

2

pluck方法是你想要什麼,而不會影響SQL不好的做法:

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

我相信這應該是選擇的答案!

+1

是的,這應該是選定的答案。 – 2014-04-21 21:08:25