【问题标题】:Table join sql to rails active record query表连接sql到rails活动记录查询
【发布时间】:2012-05-17 09:54:40
【问题描述】:

如何将以下内容转换为活动记录查询:

SELECT reviews.style_id, AVG("col1"), AVG("col2")
  FROM reviews, audios
 WHERE reviews.consumer_id = audios.consumer_id
 GROUP BY style_id;

col1col2属于audios表,但是它们是唯一命名的(reviews中没有类似的列名),所以不存在歧义错误。

我正在使用 PostgreSQL。

【问题讨论】:

  • 为什么要转换,作为原始sql执行

标签: ruby-on-rails postgresql activerecord


【解决方案1】:

如果您在 ReviewAudio 之间有关联,则如下所示:

revs = Review.joins(:audios)
             .group('style_id')
             .select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')

这将在revs 中提供Review 实例的列表,这些实例将具有额外的avg_col1avg_col2 方法来访问平均值以及通常的style/style_id 方法,但Review 通常会提供的其他列访问器方法将引发异常。

如果您没有设置关联,则可以手动执行 JOIN:

revs = Review.joins('join audios on reviews.consumer_id = audios.consumer_id')
             .group('style_id')
             .select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')

如果您只需要原始数据而不需要所有 ActiveRecord 包装和开销,那么您可以执行原始 SQL 并使用 select_rows 手动对其进行哈希处理:

Review.connection.select_rows(%q{
    select r.style_id, avg(a.col1), avg(a.col2')
    from reviews r
    join audios  a on r.consumer_id = a.consumer_id
    group by r.style_id
}).map do
  { :style_id => r.shift, :avg_col1 => r.shift.to_f, :avg_col2 => r.shift.to_f }
end

这会给你一个哈希数组。您甚至可以使用Struct 简化该方法来创建简单的数据包装类:

c    = Struct.new(:style_id, :avg_col1, :avg_col2)
revs = Review.connection.select_rows(%q{...}).map do |r|
  c.new(r.shift, r.shift.to_f, r.shift.to_f)
end

PS:不要在你的 SQL 中使用隐式连接条件,这只是产生交叉产品的一种快速简便的方法,使用显式连接条件:

SELECT ...
  FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
 GROUP BY style_id

【讨论】:

  • 穆,你知道任何关于高级活动记录查询的好教程吗?我想了解更多。谢谢
  • @Abram:有Active Record Query Interface Guide,我不知道有什么比我的标题顶部更好的了。我使用指南并在 Rails 控制台中玩了很多次来学习这些东西;当然,拥有强大的 SQL-fu 会有所帮助。
  • 顺便说一句,活动记录方法似乎是 .joins,而不是 .join .. 无论如何,都非常有帮助.. 多亏了您的帖子,我已经取得了一些惊人的成就。干杯
  • @Abram:好的,感谢您指出错别字,对此感到抱歉。他们现在都修好了。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多