2012-01-30 43 views
0

我使用activerecordfind_by_sql輸出SQL查詢的結果:的ActiveRecord的find_by_sql不輸出SQL查詢結果

S = Object.find_by_sql("SELECT * FROM foo") 
S.each do |s| 
    puts "#{s}" 
end 

我得到

#<Object:0x0000010214d5e0> 
#<Object:0x0000010214ce60> 

等等

我需要實際的結果。

在此先感謝

馬克

+0

的人類可讀的形式從你的描述,它看起來像它的正常工作,有什麼是你期待? – 2012-01-30 18:03:23

+0

你用'SELECT *'選擇的屬性是什麼?如果其中一個屬性是例如一個'name',然後你可以調用's.name'等 – maprihoda 2012-01-30 18:04:13

回答

0

有該對象沒有to_s方法。 您可以嘗試puts s.inspectp s代替

3

ActiveRecord的find_by_sql功能預計該查詢將從它是在調用的類的基礎表返回值。舉例來說,如果你有一個名爲Foo(與基礎表foos與列barbaz)類,你可以這樣做:

Foo.find_by_sql("select * from foos").each do |record| 
    puts "Got a Foo: bar=#{record.bar}, baz=#{record.baz}" 
end 

如果問題是,你不喜歡你得到你當輸出嘗試打印出一個對象(#<Object:0x0000010214d5e0>),那麼你只需要在你的類中創建一個to_s方法:

class Foo < ActiveRecord::Base 
    def to_s 
     "Foo bar=#{record.bar}, baz=#{record.baz}" 
    end 
end 

或者,不直接打印對象("#{s}"),使用inspect

puts s.inspect 
2

如果你只想從一個任意SQL查詢的原始未處理的數據,你應該使用select_rows正是如此:

SomeModel.connection.select_rows('select * from foo').each do |row| 
    # `row` is an array of strings at this point 
    puts row.join(', ') 
end 

你必須理清類型轉換和這樣的自己,但有時所有ActiveRecord機器就會阻礙你,所以你可以根據需要使用原始SQL和結果。

+0

太棒了!有沒有辦法知道返回列的名稱? (find_by_sql和其他activerecord方法失敗,當我有我的sql語句中的「左連接」) – Abdo 2012-06-13 08:22:22

+0

@Ado:不與'select_rows',只是返回一個數組爲每行,行數組的元素進來相同的順序作爲SELECT列。 – 2012-06-13 18:00:32

+0

很酷,謝謝:-) – Abdo 2012-06-14 20:59:25

0

puts通過在對象上調用to_s方法將ruby對象轉換爲字符串。
默認to_s打印對象的類和對象ID的編碼。 爲了打印對象使用inspect

locs = Location.find_by_sql('select * from locations') 
    Location Load (0.5ms) select * from locations 


locs.each do |l| 
    # it calls to_s method on object 
    puts l 
end 

#<Location:0x000000055bb328> 
#<Location:0x000000055bb058> 

locs.each do |l| 
    puts l.inspect # prints actual object 
end 

#<Location id: 15, name: "Annettaside3", street: "71838 Ritchie Cape", city: "East Destanystad", state: "Utah", zip: "58054", phone: 123456, other_phone: 987654, staff_strength: 40, is_active: true, created_at: "2012-01-25 11:17:26", updated_at: "2012-01-25 11:17:26", country_name: "Korea"> 
#<Location id: 16, name: "Sporerbury4", street: "73057 Jerad Shoal", city: "South Kyliefurt", state: "Delaware", zip: "46553-3376", phone: 123456, other_phone: 987654, staff_strength: 40, is_active: true, created_at: "2012-01-25 11:24:48", updated_at: "2012-01-25 11:24:48", country_name: "Australia">