ruby-on-rails - 表连接 sql 到 rails 事件记录查询

标签 ruby-on-rails postgresql activerecord

如何将以下内容转换为事件记录查询:

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。

最佳答案

如果你在 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

关于ruby-on-rails - 表连接 sql 到 rails 事件记录查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10633412/

相关文章:

mysql - Ruby on Rails 2.3.8 : How do I do a custom SQL query, 作为对象/ActiveRecord 对象返回,而不是散列?

ruby-on-rails - 在 Apache 服务器上哪里存储 Rails 站点?

ruby-on-rails - 如何让 Rails 与 AngularJS 协同工作

postgresql - 了解 PostgreSQL 中的相关性

php - 如何将数组编码为 URL 参数,在 PHP 中提取并作为函数参数传递给 Postgres

ruby-on-rails - CanCanCan 用于没有模型的自定义 Controller

java - 为什么我的方法没有删除存在的表?

ruby-on-rails - to_formatted_s(:long_ordinal) returning 00:00 at the end

ruby-on-rails - ActiveRecord - 将 Include 与 Select 一起使用

ruby-on-rails - 如何查询 Ruby 数组,就像使用 Rails ActiveRecord 一样?