如何在Ruby on Rails中编写任意SQL查询?

时间:2012-03-16 05:04:20

标签: sql ruby-on-rails activerecord

我正在学习,但我无法理解这一点。我当前的所有查询都类似于MyObject.find(various conditions)。返回MyObject s的数组,并且足以满足大多数目的。但现在我想创建一个最受欢迎的项目列表,其中包含select name, count(*) from MyObjects group by name order by 2之类的查询。这不会返回MyObject,这将返回任意数据列。那我该怎么做呢?

4 个答案:

答案 0 :(得分:5)

如果您使用MyObject.find_by_sql来解决您的问题。您在select语句中使用的任何其他列都可以像往常一样通过返回的对象进行访问。例如,

    MyModelName.find_by_sql("select coulmn1, column2 as somenewname,
    column3 as someothername from....")

这将返回每个都具有somenewname和someothername属性的对象。

您可以查看文档以获取有关find_by_sql方法的更多信息。

答案 1 :(得分:2)

您可以通过标准的ActiveRecord查询界面执行类似的操作:

results = MyObject.select('name, count(*) as how_many')
                  .group(:name)
                  .order(:how_many)

# And later...
results.each do |o|
    puts "#{o.name} has #{o.how_many}"
end

所以你不必诉诸SQL。

正如其他人所提到的,如果你想使用SQL查询基于SQL查询实例化一组模型对象,那么还有find_by_sql

如果您有一些SQL查询从多个表中收集数据或包含AR不擅长的东西(子选择,派生表,......),那么您可以将ActiveRecord推出并直接与数据库:

connection.select_rows('some big pile of sql').each do |r|
    # r will be an array of strings so you have to pull
    # it apart and sort out the types by hand
end

如果您将大量数据直接编码为JSON(或类似)并且不需要ActiveRecord细节并且不想支付使用的处理开销,那么使用select_rows也很有用ActiveRecord的。

答案 2 :(得分:0)

你可以随时:

MyObject.find_by_sql('query....')

但通常有更好的方法。

答案 3 :(得分:0)

你可以试试orm-way

MyObject.select(:name, "count(*) as count").group(...).order(...)