您希望手动制作特殊查询而不是基于任何特定模型。这里的列,那里的列,可能是计数,总和或其他一些计算。这是我提出的一种方式......
>> 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数组来填充选择菜单,但它可以是任何东西。)
答案 0 :(得分:1)
要通过ActiveRecord运行自定义SQL查询,有两种常规方法:
1)ActiveRecord::Base#find_by_sql
(docs)
示例(取自文档):
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.select
和ActiveRecord::Base.connection.select*
(docs)
使用它的好处是可以找回易于解析的常规Hash
对象。
重要提示:确保在使用这些方法之前清理您的查询,否则您将接受SQL注入攻击! (是的,这值得两个感叹号!!)
修改:如果您还没有这样做,请查看ActiveRecord's querying support(由Arel提供支持)。你可以做很多事情。