这是从数据库获取任意数据的好方法

时间:2011-06-07 20:24:36

标签: sql ruby-on-rails activerecord

您希望手动制作特殊查询而不是基于任何特定模型。这里的列,那里的列,可能是计数,总和或其他一些计算。这是我提出的一种方式......

>> 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而不是某些通用的,非特定于数据库的数据结构?

(如果重要的话,在这种特殊情况下,我将使用2d数组来填充选择菜单,但它可以是任何东西。)

1 个答案:

答案 0 :(得分: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提供支持)。你可以做很多事情。