【问题标题】:How do I write arbitrary SQL queries in Ruby on Rails?如何在 Ruby on Rails 中编写任意 SQL 查询?
【发布时间】:2012-03-16 05:04:20
【问题描述】:

我边走边学,但我无法弄清楚这一点。我当前的所有查询都类似于MyObject.find(various conditions)。这将返回一个MyObjects 的数组,对于大多数用途来说已经足够了。但现在我想创建一个最受欢迎的项目列表,查询类似select name, count(*) from MyObjects group by name order by 2。这不会返回MyObjects,而是会返回任意数据列。那我该怎么做呢?

【问题讨论】:

  • 这听起来像是使用 Active Record 是可行的。能说清楚一点吗?

标签: sql ruby-on-rails activerecord


【解决方案1】:

如果您使用 MyObject.find_by_sql 应该可以解决您的问题。您在 select 语句中使用的任何其他列,都可以通过返回的对象照常访问。例如,

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

这会返回对象,每个对象都有名为 somenewname 和 someothername 的属性。

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

【讨论】:

  • 谢谢,这就是我想找的东西,但 find_by_sql 似乎应该适合我的目的。
【解决方案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 细节并且不想支付使用 ActiveRecord 的处理开销,则使用 select_rows 也很有用。

【讨论】:

    【解决方案3】:

    你总是可以的:

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

    但通常有更好的方法。

    【讨论】:

      【解决方案4】:

      你可以试试orm-way

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

      【讨论】:

        猜你喜欢
        • 2013-07-15
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 2012-09-21
        • 1970-01-01
        相关资源
        最近更新 更多