2011-06-07 83 views
1

您想要手工製作一個特殊查詢,而不是基於任何特定模型。這裏的一列,一列,可能是一個計數,總和,或其他caluculation。這是我想出的一種方式...這是一個從數據庫中獲取任意數據的好方法嗎?

>> results = ActiveRecord::Base.connection.execute(
    'SELECT location, count(*) AS count FROM contracts 
    GROUP BY location 
    ORDER BY location') 
=> #<Mysql::Result:0x103197e50> 
>> arr = [] 
=> [] 
>> results.each { |row| arr << [row.first, row.last] } 
=> #<Mysql::Result:0x103197e50> 
>> arr 
=> [[nil, "189"], ["", "4"], ["Canceled", "12"], ["Cancelled", "4"], ["Closed", "1"], ["Contract - Asst", "4"], ["Contracts - Admin", "5"], ["Exec - Operations", "2"], ["Exec - Policy", "1"], ["Executive", "1"], ["Finance", "25"], ["Fully Executed", "3631"], ["General Counsel", "11"], ["On-Hold", "27"], ["Pending Distribution", "2"], ["Pending Signature", "40"], ["Per Stephen W.", "1"], ["Project Manager", "26"], ["Upcoming", "1"]] 

但我就像有史以來最差的程序員。一個好的程序員會怎麼做?

特別是,有沒有一種更簡潔的方式來訪問Mysql::Result對象中的數據?爲什麼我得到一個Mysql::Result而不是一些通用的,非數據庫特定的數據結構?

(如果它的事項,在這種特殊情況下,我將使用二維數組來填充一個選擇菜單,但它可以是任何東西。)

+0

這些是您嘗試執行的特定查詢嗎?如果是的話,你(或我或其他答覆者)可以編寫一個ActiveRecord鏈來獲取你需要的數據。 – 2011-06-07 21:01:35

回答

1

要通過ActiveRecord的運行自定義SQL查詢,一般有兩種接近:


1)ActiveRecord::Base#find_by_sqldocs

實施例(從文檔獲取):

Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date] 
> [#<Post:0x36bff9c @attributes={"first_name"=>"The Cheap Man Buys Twice"}>, ...] 

2)ActiveRecord::Base.connection.selectActiveRecord::Base.connection.select*docs

使用這個的好處,你回來定期Hash對象易於解析。


重要提示:請確保您使用這些方法,否則你會開到SQL注入攻擊前清理您的疑問! (是的,這是值得兩個感嘆號!)


編輯:做看看ActiveRecord's querying support(搭載Arel),如果你還沒有這樣做。你可以用這個做很多事情。

相關問題